GITHUB TRICKS
December 14, 2025 · View on GitHub
SOMMAIRE
- INTRO
- FILTER REPO
- NO REPLY GITHUB EMAIL
- FICHIERS DE CONFIGURATION
- SUPPRIMER HISTORIQUE FICHIER SPECIFIQUE
- SUPPRIMER UN EMAIL PUBLIQUE
- METHODE SANS FILTER-REPO (NATIVE GIT)
- BONUS
INTRO
Ce document regroupe les procédures pour :
- nettoyer l'historique Git
- supprimer des données sensibles
- supprimer un emailpublique dans les metadonnées de commits
- uniformiser les contributeurs.
⚠️ AVERTISSEMENT CRITIQUE ⚠️
La réécriture d'historique (via filter-repo ou filter-branch) est destructrice. Elle change les SHA-1 des commits (metadonnées).
Faire toujours une COPIE DE SAUVEGARDE complète du dossier local avant de lancer ces commandes
Assurez-vous que personne d'autre ne travaille sur le dépôt pendant l'opération...
FILTER REPO
git-filter-repo est l'outil recommandé par la communauté Git pour réécrire l'historique. Il est basé sur Python.
Prérequis : Python et PIP installés sur la machine.
- Installation
pip install git-filter-repo
- Vérification
git filter-repo --version
NO REPLY GITHUB EMAIL
Sur Github :
-
Settings > Email
-
Set "Keep my email addresses private" sur "On" et copier le "no reply email".

FICHIERS DE CONFIGURATION
Ces fichiers sont utilisés par certaines commandes ci-dessous pour mapper les anciennes informations vers les nouvelles.
mailmap
Utilisé pour corriger les noms et emails des auteurs/committers.
LefevreEmmanuel <47084975+EmmanuelLefevre@users.noreply.github.com> <ancien.email@example.com>
requirements.txt
Utilisé pour remplacer du texte dans le corps des fichiers ou les messages de commit.
email = ancien.email@example.com ==> email = 47084975+EmmanuelLefevre@users.noreply.github.com
SUPPRIMER HISTORIQUE FICHIER SPECIFIQUE
- Pour effacer totalement un fichier sensible (clés API, mots de passe) de tout l'historique, comme s'il n'avait jamais existé.
Se placer dans le path du projet.
git filter-repo --path CONTRIBUTORS.md --invert-paths --force
- Rétablissement du remote
git remote add origin git@github.com:<GITHUB_USERNAME>/<REMOTE_NAME>.git
- Forcer le push
Note : Si le push est rejeté, vérifiez que la branche n'est pas "Protected" dans les settings GitHub.
git push origin --force --all
git push origin --force --tags
- Vérification (ne doit rien renvoyer)
git log --all -- example.txt
SUPPRIMER UN EMAIL PUBLIQUE
- Utiliser
mailmapetreplacements.txtpour nettoyer l'historique. Copier ces deux fichiers à la racine de votre projet.
💡 Dans le cas de vouloir réaliser cette opération sur plusieurs branches il suffit de récupérer toutes les branches distantes avec la commande suivante, sinon passer directement à l'étape 2.
Se placer dans le path du projet et lancer cette commande
- Multi-branches
git fetch --all
- Lancer ensuite la commande de filtrage
git filter-repo --mailmap mailmap --replace-text replacements.txt --force
-
Supprimer
mailmapetrequirements.txde votre dépôt local (pour ne pas les publier par erreur) -
Nettoyage des résidus locaux pour gagner de la place disque
git reflog expire --expire=now --all
git gc --prune=now
- Rétablissement du remote
git remote add origin git@github.com:<GITHUB_USERNAME>/<REMOTE_NAME>.git
- Forcer le push
Note : Désactivez temporairement la protection de branche sur GitHub si nécessaire.
- Mono-branche
git push --force origin main --tags
- Multi-branches
git push origin --force --all
git push origin --force --tags
- Vérifications
Afficher les logs pour visualiser si les modifications ont correctement été appliquées.
git log --all --format='%C(yellow)%h %C(cyan)Auteur: %an <%ae> %C(magenta)Committer: %cn <%ce> %C(reset)%s'
Cette commande ne doit rien retourner étant donné que l'email publique a été supprimé.
git log --all --format='%an %ae %cn %ce' | Select-String "public.email@yahoo.fr"
- Republier la branche si nécessaire...
METHODE SANS FILTER-REPO (NATIVE GIT)
Si vous ne pouvez pas utiliser Python/git-filter-repo et que vous êtes sous PowerShell.
Cette commande est plus lente et dépréciée, mais fonctionne partout !
⚠️ git filter-branch est lent. Cette commande force l'identité sur tous les commits.
- Uniformisation de l'auteur et du committer
git filter-branch --env-filter '
CORRECT_NAME="EmmanuelLefevre"
CORRECT_EMAIL="47084975+EmmanuelLefevre@users.noreply.github.com"
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
' --tag-name-filter cat -- --all
- Nettoyage post-traitement, suppression des sauvegardes générées par filter-branch
git for-each-ref --format="%(refname)" refs/original/ | ForEach-Object { git update-ref -d $_ }
- Rétablissement du remote
git remote add origin git@github.com:<GITHUB_USERNAME>/<REMOTE_NAME>.git
- Nettoyage des résidus locaux pour gagner de la place disque
git reflog expire --expire=now --all
git gc --prune=now
- Forcer le push
git push origin --force --all
git push origin --force --tags
BONUS
PROCEDURE BRANCHE DEFAUT MODERNE
Procédure pour moderniser le nom de la branche par défaut => Master vers Main
Sur Github :
-
Settings > Branches
-
Renommer la branche par défaut (master) en main
En local :
-
Se placer sur master
-
Renommer la branche locale
git branch -m master main
- Récupérer les infos du remote
git fetch origin
- Lier la branche locale main à la branche distante main
git branch -u origin/main main
- Mettre à jour la référence HEAD du remote
git remote set-head origin -a
DELETE ALL CONTRIBUTORS
- Cette commande réécrit tout l'historique pour qu'il n'y ait plus qu'un seul auteur et committer.
git filter-repo --commit-callback '
new_name = b"EmmanuelLefevre"
new_email = b"47084975+EmmanuelLefevre@users.noreply.github.com"
commit.author_name = new_name
commit.author_email = new_email
commit.committer_name = new_name
commit.committer_email = new_email
' --force
- Rétablissement du remote
git remote add origin git@github.com:<GITHUB_USERNAME>/<REMOTE_NAME>.git
- Forcer le push
git push origin --force --all
git push origin --force --tags
- Nettoyage final (optionnel mais recommandé)
Une fois que tout est poussé et vérifié, vous pouvez nettoyer les résidus locaux pour gagner de la place disque.
git reflog expire --expire=now --all
git gc --prune=now