Venho experimentando o uso da subárvore git e deparamos com a seguinte situação.
Usei a subárvore git para adicionar um projeto externo ao meu repositório, mantive intencionalmente todo o histórico do projeto upstream, pois quero poder me referir ao histórico do projeto e também contribuir com o projeto upstream posteriormente.
Acontece que outro colaborador do projeto upstream empurrou acidentalmente um arquivo grande para a ramificação principal. Para corrigir isso, o projeto upstream reescreveu o histórico e a força empurrada para o mestre. Ao criar meu "monorepo", incluí esse commit e também gostaria de removê-lo.
Como posso atualizar meu repositório para refletir o novo histórico da subárvore?
Minha primeira tentativa foi usar o branch-filter para remover completamente a subárvore e todo o histórico.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Depois que a versão antiga da subárvore foi removida, pude adicionar novamente a subárvore usando o novo mestre upstream. No entanto, isso não funcionou porque, por algum motivo, o histórico de confirmação ainda aparece na saída do log do git.
Atualizar
Eu escrevi as etapas para criar um exemplo minimamente reproduzível.
Primeiro, crie um repositório git vazio.
git init test-monorepo cd ./test-monorepo
Crie uma confirmação inicial.
echo hello world > README git add README git commit -m 'initial commit'
Agora adicione uma subárvore para um projeto externo.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
Faça alguns commits no monorepo
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
Agora tente usar o git filter-branch para remover a subárvore.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
Examine a saída do log git, espero ver apenas meu commit inicial.
git log
git gc --prune=now
excluiria apenas confirmações que não aparecem git log
?
git log
, sem argumentos e ainda vejo os velhos compromissos.