git filter-branch
Reescreve o histórico com filtros (obsoleto — use git filter-repo)
O comando 'git filter-branch' reescreve cada commit de um branch passando por filtros — por exemplo para remover um arquivo de todo o histórico. É lento, fácil de usar errado e oficialmente desaconselhado: o próprio Git mostra um aviso e recomenda git filter-repo. Como toda reescrita, dá um novo hash a cada commit, então todos precisam clonar de novo ou redefinir.
Sinopse
git filter-branch [--index-filter <cmd>] [--tree-filter <cmd>] [--msg-filter <cmd>] [--] <rev-list>Exemplos
Remover um arquivo em todo lugar
git filter-branch --index-filter 'git rm --cached --ignore-unmatch .env' HEADO jeito antigo e lento.
O jeito recomendado
git filter-repo --path .env --invert-pathsgit filter-repo (ferramenta à parte) faz isso rápido e com segurança.
Exemplos de fluxos de trabalho
Rotate the secretPrimeiro, torná-la inútil
git filter-repo --path config/secret.yml --invert-pathsRemovê-la do histórico
git push --force --allSubstituir o histórico remoto
Solução de problemas
Não é possível criar um novo backup
Causa: refs/original existe de uma execução anterior
Apague-o (git update-ref -d refs/original/refs/heads/main) ou use -f
Dicas e armadilhas
Boas práticas
- ✓Use git filter-repo no lugar.
- ✓Faça backup do repositório antes de qualquer reescrita.
Erros comuns
- ✗Reescrever histórico compartilhado sem avisar o time.
- ✗Achar que uma reescrita torna seguro um segredo vazado — troque o segredo.
Perguntas frequentes
É muito lento e tem muitas armadilhas que corrompem a reescrita em silêncio; o filter-repo resolve as duas coisas.