git filter-branch
Réécrire l’historique avec des filtres (obsolète — utilisez git filter-repo)
La commande 'git filter-branch' réécrit chaque commit d’une branche à travers des filtres — par exemple pour retirer un fichier de tout l’historique. Elle est lente, facile à mal utiliser et officiellement déconseillée : Git lui-même affiche un avertissement et recommande git filter-repo. Comme toute réécriture, elle donne un nouveau hash à chaque commit, donc tout le monde doit recloner ou réinitialiser.
Synopsis
git filter-branch [--index-filter <cmd>] [--tree-filter <cmd>] [--msg-filter <cmd>] [--] <rev-list>Exemples
Retirer un fichier partout
git filter-branch --index-filter 'git rm --cached --ignore-unmatch .env' HEADL’ancienne méthode, lente.
La méthode recommandée
git filter-repo --path .env --invert-pathsgit filter-repo (outil séparé) le fait vite et sans risque.
Exemples de workflows
Rotate the secretD’abord, le rendre inutilisable
git filter-repo --path config/secret.yml --invert-pathsLe retirer de l’historique
git push --force --allRemplacer l’historique distant
Dépannage
Impossible de créer une nouvelle sauvegarde
Cause : refs/original existe depuis une exécution précédente
Supprimez-le (git update-ref -d refs/original/refs/heads/main) ou utilisez -f
Astuces et pièges
Bonnes pratiques
- ✓Utilisez plutôt git filter-repo.
- ✓Sauvegardez le dépôt avant toute réécriture.
Erreurs fréquentes
- ✗Réécrire l’historique partagé sans prévenir l’équipe.
- ✗Croire qu’une réécriture rend sûr un secret divulgué — changez le secret.
FAQ
Elle est très lente et a de nombreux pièges qui corrompent la réécriture en silence ; filter-repo corrige les deux.