Tornar o atual commit um único commit (inicial) no repositório git?

Atualmente, eu tenho um repositório Git local, no qual clico no repositório do Github.

O repositório local tem ~ 10 commits, e o repositório do Github é uma duplicata sincronizada disso.

O que eu gostaria de fazer é remover TODOS os históricos da versão do repositório Git local, para que o conteúdo atual do repositório seja exibido como a única confirmação (e, portanto, as versões mais antigas dos arquivos no repositório não serão salvas),

Eu gostaria de clicar nessas alterações no Github.

Eu explorei o rebase do Git, mas isso parece ser mais adequado para remover certas versões. Outra solução potencial é remover o repositório local e criar um novo, embora isso provavelmente crie muito trabalho!

ETA: Existem certos diretórios / arquivos que não são monitorados - se possível, eu gostaria de apoiar a desativação desses arquivos.

460
13 марта '12 в 14:41 2012-03-13 14:41 kaese é definido 13 de março , '12 em 2:41 PM 2012-03-13 14:41
@ 14 respostas

Aqui está uma abordagem de força bruta. Também remove a configuração do repositório.

Nota Isso não funciona se houver submódulos no repositório! Se você usar submódulos, deverá usar, por exemplo, uma reinicialização interativa.

Etapa 1: exclua todo o histórico ( certifique-se de ter um backup, é impossível retornar )

 rm -rf .git 

Etapa 2: restaure o repositório Git apenas com o conteúdo atual

 git init git add . git commit -m "Initial commit" 

Etapa 3: clique no GitHub.

 git remote add origin <github-uri> git push -u --force origin master 
747
13 марта '12 в 14:44 2012-03-13 14:44 Resposta é dada por Fred Foo em 13 de março '12 às 14:44 2012-03-13 14:44

A única solução que funciona para mim (e os sub-módulos funcionam) é

 git checkout --orphan newBranch git add -A # Add all files and commit them git commit git branch -D master # Deletes the master branch git branch -m master # Rename the current branch to master git push -f origin master # Force push master branch to github git gc --aggressive --prune=all # remove the old files 
border=0

Remover .git/ sempre causa grandes problemas quando eu tenho sub-módulos. Usar git rebase --root alguma forma causar conflitos para mim (e eu tenho muita história).

410
27 окт. resposta dada a Zeelot 27 de outubro. 2012-10-27 21:16 '12 às 21:16 2012-10-27 21:16

Essa é minha abordagem favorável:

 git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree}) 

Isto irá criar um novo ramo com um único commit, o qual irá adicionar tudo ao HEAD. Não muda nada, por isso é completamente seguro.

63
22 марта '13 в 16:53 2013-03-22 16:53 a resposta é dada dan_waterworth 22 de março '13 às 16:53 2013-03-22 16:53

Outra opção que pode ser muito trabalhosa se você tiver muitos commits é um rebase interativo (se sua versão do git for> 1.7.12): git rebase --root -i

Ao apresentar uma lista de commits no seu editor:

  • Alterar "escolha" para "reformular" para o primeiro commit
  • Mude "pick" para "fixup" a cada outro commit

Salve e feche. git irá reiniciar.

No final, você terá um novo retentor de raiz, que é uma combinação de todos os que vieram depois dele.

A vantagem é que você não precisa deletar seu repositório, e se você tiver outros pensamentos, você sempre tem uma reserva.

Se você realmente deseja destruir seu histórico, redefina o mestre para este commit e exclua todos os outros ramos.

26
14 марта '12 в 23:24 2012-03-14 23:24 a resposta é dada por Carl em 14 de março '12 às 23:24 2012-03-14 23:24

Excluir a pasta .git pode causar problemas no repositório git. Se você quiser excluir todo o seu histórico de fixação.

siga estas etapas:

etapa 1 (checkout)

 git checkout --orphan latest_branch 

passo 2 (adicione todos os arquivos)

 git add -A 

Etapa 3 (confirmar alterações)

 git commit -am "commit message" 

passo 4 (Excluir ramificação)

 git branch -D master 

passo 5 (renomear ramo atual para mestre)

 git branch -m master 

Passo 6 (etapa final, poder para atualizar seu repositório)

 git push -f origin master 

!! Agora aproveite a história da fixação!

21
14 окт. a resposta é dada por Shivam Srivastava em 14 de outubro. 2017-10-14 12:08 '17 às 12:08 2017-10-14 12:08

Variante do método larsmans proposto:

Salve a lista de arquivos não impressos:

 git ls-files --others --exclude-standard > /tmp/my_untracked_files 

Salve a configuração do git:

 mv .git/config /tmp/ 

Então siga os primeiros passos de larsmans:

 rm -rf .git git init git add . 

Restaure a configuração:

 mv /tmp/config .git/ 

Descartar arquivos não testados:

 cat /tmp/my_untracked_files | xargs -0 git rm --cached 

Então corrija:

 git commit -m "Initial commit" 

Finalmente, clique no seu repositório:

 git push -u --force origin master 
14
19 апр. Resposta dada por lalebarde em abr 19 2014-04-19 11:58 '14 às 11:58 2014-04-19 11:58

Crie uma ramificação, copie todo o conteúdo para ela, copie-a e exclua a ramificação principal:

 git checkout --orphan newBranch; git add -A ;git commit -am 'first commit' ;git branch -D master;git branch -m master; git push -f origin master; git gc --aggressive --prune=all 
5
12 марта '17 в 17:53 2017-03-12 17:53 a resposta é dada pratik_bhavsar 12 de março de '17 às 17:53 2017-03-12 17:53

Você pode usar clones rasos (git> 1.9):

 git clone --depth depth remote-url 

Outras leituras: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

5
04 апр. a resposta é dada por Matthias M 04 abr. 2016-04-04 14:05 '16 às 2:05 pm 2016-04-04 14:05

O método abaixo é reproduzível, portanto, não há necessidade de iniciar o clone novamente, se ambos os lados forem consistentes, basta executar o script no outro lado.

 git log -n1 --format=%H >.git/info/grafts git filter-branch -f rm .git/info/grafts 

Se você quiser limpá-lo, tente o script:

http://sam.nipl.net/b/git-gc-all-ferocious

Eu escrevi um script que "mata histórico" para cada ramo no repositório:

http://sam.nipl.net/b/git-kill-history

Veja também: http://sam.nipl.net/b/confirm

2
06 февр. A resposta foi dada por Sam Watkins em 06 de fevereiro. 2013-02-06 19:46 '13 às 19:46 2013-02-06 19:46
 git for-each-ref --format='git update-ref -d %(refname)' \ refs/{heads,tags} | sh -x current=$(git commit-tree -m 'Initial commit' `git write-tree`) git update-ref -m 'Initial commit' `git symbolic-ref HEAD` $current 

Isso removerá todas as ramificações e tags locais, criará um evento sem histórico com o status do seu cheque atual em qualquer filial do atual e deixará tudo o mais em seu repositório intacto. Então você pode clicar com força nos seus controles remotos como quiser.

1
05 апр. a resposta é dada jthill 05 abr 2014-04-05 04:42 '14 às 4:42 2014-04-05 04:42

O que eu gostaria de fazer é remover TODOS os históricos da versão do repositório Git local, para que o conteúdo atual do repositório seja exibido como a única confirmação (e, portanto, as versões mais antigas dos arquivos no repositório não serão salvas),

Resposta mais conceitual:

git automaticamente garbage coleta commits antigos se tags / branches / links não apontarem para eles. Assim, você só precisa remover todas as tags / branches e criar um novo commit órfão associado a um contrato branch - by, você permitirá que o branch master indique este commit.

Comissões antigas e inacessíveis nunca mais serão vistas por ninguém, a menos que se aprofundem nos comandos do Git de baixo nível. Se isso for o suficiente para você, paro por aí e deixo o GC automático fazer isso quando quiser. Se você quiser se livrar deles imediatamente, você pode usar o git gc (talvez com --aggressive --prune=all ). Para um repositório Git remoto, você não poderá fazer isso, a menos que tenha acesso ao sistema de arquivos.

0
04 апр. a resposta é dada por AnoE 04 abr. 2016-04-04 14:27 '16 às 2:27 PM 2016-04-04 14:27

Para fazer isso, use o comando Clone pequeno git clone --depth 1 URL - ele clonará somente o repositório HEAD atual

-1
23 авг. A resposta é dada por kkarki 23 ago. 2017-08-23 18:55 '17 às 6:55 pm 2017-08-23 18:55

Para remover o último commit do git, você pode simplesmente rodar

 git reset --hard HEAD^ 

Se você excluir vários commits de cima, você pode executar

 git reset --hard HEAD~2 

para remover os dois últimos commits. Você pode aumentar o número para remover ainda mais commits.

Mais informações aqui.

Git tutoturial aqui fornece assistência para limpar o repositório:

Você deseja excluir o arquivo do histórico e adicioná-lo ao .gitignore para garantir que ele não seja repetido acidentalmente. Para nossos exemplos, vamos remover o Rakefile do repositório github gem.

 git clone https://github.com/defunkt/github-gem.git cd github-gem git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch Rakefile' \ --prune-empty --tag-name-filter cat -- --all 

Agora que apagamos o arquivo do histórico, garantimos que não o fazemos por acidente.

 echo "Rakefile" >> .gitignore git add .gitignore git commit -m "Add Rakefile to .gitignore" 

Se você estiver satisfeito com o estado do repositório, precisará forçar as mudanças para sobrescrever o repositório remoto.

 git push origin master --force 
-1
05 июня '13 в 8:41 2013-06-05 08:41 a resposta é dada octoback 05 de junho '13 às 8:41 2013-06-05 08:41

Eu resolvi um problema semelhante simplesmente removendo a pasta .git do meu projeto e reintegrando o controle de versão via IntelliJ. Nota A pasta .git está oculta. Você pode visualizá-lo no terminal com ls -a e excluí-lo com rm -rf .git .

-1
11 апр. Resposta dada por JB Lovell em 11 Abr 2017-04-11 21:54 17 às 21:54 de 2017-04-11 21:54

Outras questões sobre tags ou Ask a Question