O capítulo 9 do livro Pro Git tem uma seção sobre como remover objetos .
Deixe-me descrever brevemente as etapas aqui:
git filter-branch --index-filter \
'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
--tag-name-filter cat -- --all
Como a opção de rebasing descrita antes, filter-branché a operação de reescrita. Se você publicou a história, você terá que --forceempurrar os novos refs.
A filter-branchabordagem é consideravelmente mais poderosa do que a rebaseabordagem, uma vez que
- permite que você trabalhe em todos os branches / refs de uma vez,
- renomeia qualquer tag na hora
- opera de forma limpa, mesmo que tenha havido vários commits de mesclagem desde a adição do arquivo
- opera de forma limpa, mesmo se o arquivo foi (re) adicionado / removido várias vezes no histórico de (a) ramificação (s)
- não cria novos commits não relacionados, mas sim os copia enquanto modifica as árvores associadas a eles. Isso significa que coisas como commits assinados, notas de commit etc. são preservados
filter-branch mantém backups também, então o tamanho do repo não diminuirá imediatamente, a menos que você expire os reflogs e a coleta de lixo:
rm -Rf .git/refs/original # careful
git gc --aggressive --prune=now # danger