← Tous les articles
January 21, 2026

Comment supprimer définitivement des fichiers et données sensibles et des mots de passe d’un dépôt Git

Développement Web

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.example sans 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

Thiébault Michaël ©