Copiar um repositório git sem histórico


200

Atualmente, tenho um repositório privado no github que quero tornar público. No entanto, alguns dos commits iniciais contêm informações que eu não quero tornar públicas (credenciais codificadas, etc).

Qual é o caminho mais fácil para tornar público o commit mais recente (eu realmente não preciso nem quero os commit anteriores no repositório público) sem incluir parte ou todo o histórico de commit?


Por que você não cria apenas um novo repositório?
31715 Stephan

2
@ Stefan Estou bem em criar um novo repositório, mas como posso obter o estado mais recente do repositório antigo e comprometê-lo com o novo?
Rafe

19
você pode simplesmente excluir a pasta .git e fazer um git o init novamente na pasta suas fontes são
Stephan

2
Excluindo a pasta .git fará seus dois repositores incompatíveis, você não será capaz de fundir de um para o outro
Arnold Roa

Você não pode rebase isso? Você literalmente esmaga todos os commit antigos e depois (força) empurra.
xaxxon 27/02

Respostas:


322

Você pode limitar a profundidade do histórico ao clonar :

--depth <depth>
Create a shallow clone with a history truncated to the specified 
number of revisions.

Use isso se desejar um histórico limitado, mas ainda um pouco.


41
Dê a este homem um cookie (na forma de marcar esta resposta correta) :)
FateNuller

7
Isso não aborda o uso pretendido implícito na pergunta, que é capaz de enviar para um repositório público remoto. Tentar empurrar um clone superficial resulta em shallow update not allowed.
Brad Knox

280

Use o seguinte comando:

git clone --depth <depth> -b <branch> <repo_url>

Onde:

  • depthé a quantidade de confirmações que você deseja incluir. ou seja, se você quiser apenas o uso de confirmação mais recentegit clone --depth 1
  • branché o nome da ramificação remota da qual você deseja clonar. ou seja, se você deseja os últimos 3 commit do masteruso do branchgit clone --depth 3 -b master
  • repo_url é o URL do seu repositório

7
Esta é realmente a mesma resposta que Gautier, mas mais completa e com um exemplo.
aled

3
De fato é. Às vezes, o exemplo é o que é necessário. Para mim, escrevê-lo fora é o que esclareceu a questão
Agam Rafaeli

3
+1 à resposta principal, mas também a esta, para explicar como selecionar em qual ramo você deseja aplicar a profundidade - eu sei que isso faz parte do comando clone - mas une tudo muito bem na minha mente simples ... e eu como simples
:)

7
Como isso responde à pergunta? Tudo isso faz é criar um clone superficial localmente, mas e daí? Como você copia essa cópia local com histórico limitado para um novo repositório?
BradDaBug

4
@BradDaBug traz um ponto válido. Segui as instruções acima, limitando a profundidade a 1, depois mudei a origem remota e tentei avançar para o meu novo repositório. No entanto, recebi um erro informando shallow update not allowed. Achei que essa resposta de estouro de pilha é útil nesse caso.
Craig Myles

18

A exclusão da .gitpasta provavelmente é o caminho mais fácil, pois você não deseja / precisa do histórico (como disse Stephan).

Assim, você pode criar um novo repositório a partir do seu commit mais recente: ( Como clonar o projeto seed / kick-start sem todo o histórico? )

git clone <git_url>

exclua .gite depois execute

git init

Ou se você deseja reutilizar seu repo atual: Torne o commit atual o único commit (inicial) em um repositório Git?

Siga os passos acima então:

git add .
git commit -m "Initial commit"

Empurre para o seu repo.

git remote add origin <github-uri>
git push -u --force origin master

6
#!/bin/bash
set -e

# Settings
user=xxx
pass=xxx
dir=xxx
repo_src=xxx
repo_trg=xxx
src_branch=xxx

repo_base_url=https://$user:$pass@bitbucket.org/$user
repo_src_url=$repo_base_url/$repo_src.git
repo_trg_url=$repo_base_url/$repo_trg.git

echo "Clone Source..."
git clone --depth 1 -b $src_branch $repo_src_url $dir

echo "CD"
cd ./$dir

echo "Remove GIT"
rm -rf .git

echo "Init GIT"
git init
git add .
git commit -m "Initial Commit"
git remote add origin $repo_trg_url

echo "Push..."
git push -u origin master

2
o --depth 1é desnecessário neste caso porque o histórico também é excluído comrm -rf .git
rayphi

3
Eu acho que eu iria fazê-lo como este:git clone --depth 1 -b $src_branch $repo_src_url $dir && cd ./$dir && git commit --amend --author "Some One <some@one.com>" -m "Initial Commit" && git remote set-url origin $repo_trg_url && git push -u origin master
rayphi

11
@rayphi sim o --depth 1é desnecessário, mas também é inofensivo e ele salva um pouco de largura de banda de rede (nenhum ponto buscar uma história que você está prestes a excluir qualquer maneira)
Silas S. Brown

1
Eu não recomendo fazer isso se você quiser manter seus repositórios compatíveis.
Arnold Roa

A remoção do .git também remove todos os ganchos do git.
JudaPriest 29/05/19

0

Não é exatamente isso que esmaga uma rebase? Apenas esmague tudo, exceto o último commit e, em seguida, (force) empurre.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.