Il arrive à tout le monde :
on commit par erreur des données sensibles (comme .env ou des mots de passe en clair) dans un dépôt Git.
Même si le dépôt est privé, ces secrets restent dans tout l’historique Git, ce qui peut devenir un vrai problème de sécurité — surtout si le dépôt devient public un jour.
Dans cet article, je vous explique pas à pas comment supprimer définitivement des fichiers sensibles et des mots de passe de votre dépôt avec git filter-repo.
⚠️ Attention
Réécrire l’historique Git est une opération destructrice :
- Les identifiants de commit changent
- Tous les collaborateurs doivent re-cloner le dépôt
- Il faudra forcer le push vers le dépôt distant
➡️ Assurez-vous de comprendre l’impact avant de continuer.
Étape 1 — Installer git filter-repo
git filter-repo est le remplaçant moderne de git filter-branch.
macOS (Homebrew) :
brew install git-filter-repo
Linux :
sudo apt install git-filter-repo
Vérifiez l’installation :
git filter-repo --help
Étape 2 — Identifier les données sensibles
Rechercher un mot de passe dans l’historique :
git log -p | grep "SECRET_PASSWORD"
Vérifier si les fichiers .env existent dans l’historique :
git log -- .env.local
git log -- .env.prod
Si Git retourne des commits, ces fichiers sont présents et doivent être supprimés.
Étape 3 — Supprimer .env.local et .env.prod de l’historique
⚠️ Faites cette opération sur un dépôt propre (pas de modifications locales non commit).
git filter-repo \
--invert-paths \
--path .env.local \
--path .env.prod
Ce que cela fait :
- Supprime ces fichiers de tous les commits
- Réécrit l’historique complet du dépôt
- Supprime définitivement les anciens objets Git
Vous verrez un message comme :
NOTICE: Removing 'origin' remote
C’est normal.
Étape 4 — Supprimer un mot de passe d’un fichier PHP
Parfois, vous devez garder le fichier, mais retirer un secret de l’historique.
Exemple (mauvais) :
'password' => Hash::make('SECRET_PASSWORD'),
Remplacez-le par une variable d’environnement :
'password' => Hash::make(env('ADMIN_PASSWORD'));
Mettez à jour .env.example :
ADMIN_PASSWORD=change_me
Étape 5 — Réécrire l’historique pour effacer l’ancien mot de passe
Pour remplacer le mot de passe dans tous les commits :
git filter-repo \
--replace-text <(cat <<'EOF'
SECRET_PASSWORD==>REDACTED_PASSWORD
EOF
)
Maintenant :
- Le vrai mot de passe est supprimé
- L’historique Git ne contient plus le secret
- Seul un placeholder reste
Étape 6 — Vérifier le nettoyage
git log -p | grep SECRET_PASSWORD
git grep SECRET_PASSWORD $(git rev-list --all)
Étape 7 — Pousser l’historique nettoyé sur GitHub
git remote add origin git@github.com:USERNAME/REPO.git
git push --force --all
git push --force --tags
Étape 8 — Re-cloner partout
Puisque l’historique a changé, tous les clones existants sont invalides.
git clone git@github.com:USERNAME/REPO.git
⚠️ Ne faites jamais un simple pull sur un ancien clone.
Étape 9 — Prévenir les problèmes à l’avenir
Ajouter dans .gitignore :
.env
.env.local
.env.prod
.env.*.local
Bonnes pratiques :
- Ne jamais commit de secrets
- Utiliser systématiquement des variables d’environnement
- Garder
.env.examplesans vrais mots de passe - Changer immédiatement les mots de passe exposés
✅ Conclusion
Avec git filter-repo, il est possible de :
- Supprimer définitivement des fichiers sensibles
- Effacer des mots de passe de l’historique Git
- Sécuriser un dépôt avant de le rendre public
C’est un peu technique, mais une fois fait correctement, votre dépôt est propre, sûr et prêt pour l’avenir.
Bon codage