git filter-branch
Reescribe el historial con filtros (obsoleto — usa git filter-repo)
El comando 'git filter-branch' reescribe cada commit de una rama a través de filtros — por ejemplo para quitar un archivo de todo el historial. Es lento, fácil de usar mal y está desaconsejado oficialmente: el propio Git muestra una advertencia y recomienda git filter-repo. Como toda reescritura, da un hash nuevo a cada commit, así que todos deben volver a clonar o restablecer.
Sinopsis
git filter-branch [--index-filter <cmd>] [--tree-filter <cmd>] [--msg-filter <cmd>] [--] <rev-list>Ejemplos
Quitar un archivo en todas partes
git filter-branch --index-filter 'git rm --cached --ignore-unmatch .env' HEADLa forma antigua y lenta.
La forma recomendada
git filter-repo --path .env --invert-pathsgit filter-repo (herramienta aparte) lo hace rápido y de forma segura.
Ejemplos de flujos de trabajo
Rotate the secretPrimero, inutilízala
git filter-repo --path config/secret.yml --invert-pathsQuitarla del historial
git push --force --allReemplazar el historial remoto
Solución de problemas
No se puede crear una copia nueva
Causa: refs/original existe de una ejecución anterior
Bórralo (git update-ref -d refs/original/refs/heads/main) o usa -f
Consejos y trampas
Buenas prácticas
- ✓Usa git filter-repo en su lugar.
- ✓Haz una copia del repositorio antes de cualquier reescritura.
Errores comunes
- ✗Reescribir historial compartido sin avisar al equipo.
- ✗Creer que una reescritura vuelve seguro un secreto filtrado — cambia el secreto.
Preguntas frecuentes
Es muy lento y tiene muchas trampas que corrompen la reescritura en silencio; filter-repo resuelve ambas cosas.