Receio não ter encontrado nada parecido com esse cenário em particular.
Eu tenho um repositório git com muito histórico: mais de 500 ramos, mais de 500 tags, desde meados de 2007. Ele contém ~ 19.500 confirmações. Gostaríamos de remover todo o histórico antes de 1º de janeiro de 2010, para torná-lo menor e mais fácil de lidar (manteríamos uma cópia completa do histórico em um repositório de archive).
Conheço o commit que quero que tenha se tornado a raiz do novo repositório. No entanto, não consigo descobrir o git mojo correto para truncar o repositório e começar com esse commit. Eu estou supondo que alguma variante de
git filter-branch
seria necessário envolver enxertos; ele também pode ser necessária para tratar cada um dos mais de 200 filiais queremos manter separadamente e depois corrigir o repo de volta juntos (algo que eu não sei como fazer).
Alguém já fez algo assim? Eu tenho o git 1.7.2.3, se isso importa.
fonte
git filter-branch --tag-name-filter cat -- --all
para atualizar as tags. Mas também tenho tags mais antigas apontando para o histórico antigo que desejo excluir. Como posso me livrar de todas essas tags antigas? Se eu não excluí-los, o histórico mais antigo não desaparece e ainda posso vê-logitk --all
.echo "<NEW-ROOT-HASH>" > .git/info/grafts
Talvez seja tarde demais para postar uma resposta, mas como esta página é o primeiro resultado do Google, ainda pode ser útil.
Se você deseja liberar espaço no seu repositório git, mas não deseja reconstruir todos os seus commits (rebase ou enxerto) e ainda conseguir empurrar / puxar / mesclar pessoas que possuem o repositório completo, você pode usar o git clone clone superficial (- profundidade parâmetro).
Você poderá rasgar seu repo existente, seguindo estas etapas:
Como remover todas as tags locais do git?
Ps: As versões mais antigas do git não suportavam clone / push / pull de / para repositórios rasos.
fonte
cd
uma pasta que acabou de ser excluída? Sinto que há algumas informações ausentes aqui. Além disso, existe uma maneira de aplicar essas alterações ao repositório remoto?git clone file:///Users/me/Projects/myProject myClonedProject --shallow-since=2016-09-02
Funciona como um encanto!git filter-branch -- --all
. Isso vai mudar todos os hashes nele, mas depois que você vai ser capaz de empurrá-lo para um novo repoeste método é fácil de entender e funciona bem. O argumento para o script (
$1
) é uma referência (tag, hash, ...) ao commit a partir do qual você deseja manter seu histórico.NOTA as tags antigas ainda permanecerão presentes; então você pode precisar removê-los manualmente
observação: eu sei que isso é quase o mesmo que o @yoyodin, mas existem alguns comandos e informações extras importantes aqui. Tentei editar a resposta, mas como é uma alteração substancial na resposta de @ yoyodin, minha edição foi rejeitada, então aqui estão as informações!
fonte
git prune
egit gc
. Existe uma explicação para o restante dos comandos no script? Como está, não está claro quais argumentos estão sendo passados para ele e o que cada comando está fazendo. Obrigado.-p
aorebase
comando, como sugerido em outra respostaTente este método Como truncar o histórico do git :
Aqui
$1
é SHA-1 da submissão que você deseja manter eo script vai criar novo ramo que contém todos os commits entre$1
emaster
e toda a história mais antigo é descartado. Observe que esse script simples pressupõe que você não possui ramificação existente chamadatemp
. Observe também que esse script não limpa os dados do git para o histórico antigo. Executegit gc --prune=all && git repack -a -f -F -d
depois de verificar se realmente deseja perder todo o histórico. Você também pode precisar,rebase --preserve-merges
mas esteja avisado de que a implementação git desse recurso não é perfeita. Inspecione os resultados manualmente, se você usar isso.fonte
rebase
etapa. Estranho - eu não esperava que conflitos de mesclagem fossem possíveis nessas circunstâncias.git commit --allow-empty -m "Truncate history"
se a confirmação que você fez check-out não contém nenhum arquivo.Como alternativa à reescrita do histórico, considere usar
git replace
como neste artigo do livro Pro Git . O exemplo discutido envolve a substituição de uma confirmação pai para simular o início de uma árvore, mantendo o histórico completo como um ramo separado para proteção.fonte
git replace
. Acredito que isso foi corrigido em outra pergunta em que você postou esta resposta.git replace
comparaçãogit graft
é feita em stackoverflow.com/q/6800692/873282Se você deseja manter o repositório upstream com histórico completo , mas com caixas menores locais, faça um clone superficial
git clone --depth=1 [repo]
.Depois de enviar uma confirmação, você pode fazer
git fetch --depth=1
podar os velhos commits. Isso torna os antigos commit e seus objetos inacessíveis.git reflog expire --expire-unreachable=now --all
. Expirar todos os commit antigos e seus objetosgit gc --aggressive --prune=all
remover os objetos antigosConsulte também Como remover o histórico local do git após uma confirmação? .
Observe que você não pode enviar este repositório "superficial" para outro lugar: "atualização superficial não permitida". Consulte Remoto rejeitado (atualização superficial não permitida) após alterar o URL remoto do Git . Se você quiser fazer isso, terá que se ater à enxertia.
fonte
Eu precisava ler várias respostas e outras informações para entender o que estava fazendo.
1. Ignore tudo mais antigo que um determinado commit
O arquivo
.git/info/grafts
pode definir pais falsos para uma confirmação. Uma linha com apenas um ID de confirmação diz que o commit não tem um pai. Se quisermos dizer que nos preocupamos apenas com os últimos 2000 confirmados, podemos digitar:O git rev-parse nos fornece o id de confirmação do 2000º pai do commit atual. O comando acima substituirá o arquivo de enxertos, se presente. Verifique se está lá primeiro.
2. Reescreva o histórico do Git (opcional)
Se você quiser tornar esse pai falso enxertado real, execute:
Ele mudará todos os IDs de confirmação. Todas as cópias deste repositório precisam ser atualizadas com força.
3. Limpe o espaço em disco
Não fiz o passo 2, porque queria que minha cópia permanecesse compatível com o upstream. Eu só queria economizar espaço em disco. Para esquecer todos os antigos commit:
Alternativa: cópias rasas
Se você possui uma cópia superficial de outro repositório e deseja apenas economizar espaço em disco, é possível atualizar
.git/shallow
. Mas tome cuidado para que nada esteja apontando para um commit de antes. Então você pode executar algo parecido com isto:A entrada em águas rasas funciona como um enxerto. Mas tome cuidado para não usar enxertos e superficiais ao mesmo tempo. Pelo menos, não tem as mesmas entradas, isso irá falhar.
Se você ainda tiver algumas referências antigas (tags, ramificações, cabeças remotas) que apontam para confirmações mais antigas, elas não serão limpas e você não economizará mais espaço em disco.
fonte
git replace
. Veja stackoverflow.com/questions/6800692/…Quando você rebase ou pressiona a cabeça / mestre, este erro pode ocorrer
Para resolver esse problema no painel git, remova a ramificação principal de "Ramificações protegidas"
então você pode executar este comando
ou
fonte
Existem muitas respostas aqui que não são atuais e algumas não explicam completamente as consequências. Aqui está o que funcionou para mim ao aparar a história usando o último git 2.26:
Primeiro, crie uma confirmação fictícia. Essa confirmação aparecerá como a primeira confirmação no seu repositório truncado. Você precisa disso porque esse commit manterá todos os arquivos base para o histórico que você está mantendo. O SHA é o ID da confirmação anterior da confirmação que você deseja manter (neste exemplo
8365366
). A string 'Initial' aparecerá como mensagem de confirmação do primeiro commit. Se você estiver usando o Windows, digite o comando abaixo no prompt de comando do Git Bash.O comando acima imprimirá SHA, por exemplo
d10f7503bc1ec9d367da15b540887730db862023
,.Agora, basta digitar:
Isso primeiro colocará todos os arquivos como confirmação
8365366
no commit dummyd10f750
. Em seguida, ele reproduzirá todas as confirmações após 8365366 por cimad10f750
. Finalmentemaster
, o ponteiro de ramificação será atualizado para a última confirmação reproduzida.Agora, se você deseja enviar esses repositórios truncados, basta
git push -f
.Lembre-se de algumas coisas (isso se aplica a outros métodos e também a este): As tags não são transferidas. Enquanto os IDs de confirmação e os carimbos de data e hora são preservados, você verá o GitHub mostrando esses commits no cabeçalho do lumpsum
Commits on XY date
.Felizmente, é possível manter o histórico truncado como "arquivo morto" e, posteriormente, você pode associar-se ao repositório aparado com o repositório de repositório. Para fazer isso, consulte este guia .
fonte
você pode excluir o diretório, os arquivos e também todo o histórico relacionado ao diretório ou arquivo usando o jar abaixo mencionado [faça o download] e os comandos
arquivo bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
git clone --bare repo-url cd repo_dir java -jar bfg.jar --delete-folders folder_name git reflog expirar --expire = now --todos && git gc --prune = now --gitive git push --mirror repo_url
fonte
fonte