git filter-branch

Parches y reescritura

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>
[ ] opcional| o<arg> valor a sustituir... repetible--flag opción

Ejemplos

Quitar un archivo en todas partes

git filter-branch --index-filter 'git rm --cached --ignore-unmatch .env' HEAD

La forma antigua y lenta.


La forma recomendada

git filter-repo --path .env --invert-paths

git filter-repo (herramienta aparte) lo hace rápido y de forma segura.

Ejemplos de flujos de trabajo

1
Rotate the secret

Primero, inutilízala

2
git filter-repo --path config/secret.yml --invert-paths

Quitarla del historial

3
git push --force --all

Reemplazar 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

A:

Es muy lento y tiene muchas trampas que corrompen la reescritura en silencio; filter-repo resuelve ambas cosas.