GITHUB TRICKS

December 14, 2025 · View on GitHub

SOMMAIRE

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 :

  1. Settings > Email

  2. Set "Keep my email addresses private" sur "On" et copier le "no reply email".

Github No Reply Email Screen

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

  1. 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
  1. Rétablissement du remote
git remote add origin git@github.com:<GITHUB_USERNAME>/<REMOTE_NAME>.git
  1. 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
  1. Vérification (ne doit rien renvoyer)
git log --all -- example.txt

SUPPRIMER UN EMAIL PUBLIQUE

  1. Utiliser mailmap et replacements.txt pour 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
  1. Lancer ensuite la commande de filtrage
git filter-repo --mailmap mailmap --replace-text replacements.txt --force
  1. Supprimer mailmap et requirements.tx de votre dépôt local (pour ne pas les publier par erreur)

  2. Nettoyage des résidus locaux pour gagner de la place disque

git reflog expire --expire=now --all
git gc --prune=now
  1. Rétablissement du remote
git remote add origin git@github.com:<GITHUB_USERNAME>/<REMOTE_NAME>.git
  1. 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
  1. 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"
  1. 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.

  1. 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
  1. 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 $_ }
  1. Rétablissement du remote
git remote add origin git@github.com:<GITHUB_USERNAME>/<REMOTE_NAME>.git
  1. Nettoyage des résidus locaux pour gagner de la place disque
git reflog expire --expire=now --all
git gc --prune=now
  1. 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 :

  1. Settings > Branches

  2. Renommer la branche par défaut (master) en main

En local :

  1. Se placer sur master

  2. Renommer la branche locale

git branch -m master main
  1. Récupérer les infos du remote
git fetch origin
  1. Lier la branche locale main à la branche distante main
git branch -u origin/main main
  1. Mettre à jour la référence HEAD du remote
git remote set-head origin -a

DELETE ALL CONTRIBUTORS

  1. 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
  1. Rétablissement du remote
git remote add origin git@github.com:<GITHUB_USERNAME>/<REMOTE_NAME>.git
  1. Forcer le push
git push origin --force --all
git push origin --force --tags
  1. 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