366 votes

Git, réécriture des noms d'utilisateur et des courriels de commit précédents.

J'ai envoyé un certain nombre de commits à un projet sur Github, mais je me suis rendu compte que je n'avais pas configuré l'adresse électronique et le nom complet du committer sur l'ordinateur que j'utilise actuellement pour faire mes commits et donc l'avatar de l'utilisateur et l'adresse électronique ne sont pas là.

Comment puis-je réécrire toutes les adresses électroniques et tous les noms d'utilisateur des anciens commettants ?

417voto

brauliobo Points 468

Vous pouvez ajouter cet alias :

git config --global alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\`echo \$VAR\`\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \$@; }; f"

Pour changer le nom de l'auteur :

git change-commits GIT_AUTHOR_NAME "old name" "new name"

ou l'email pour seulement les 10 derniers commits :

git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD

Alias :

change-commits="!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" \$@; }; f"

Source : https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

171voto

Olivier Verdier Points 12332

Voir aquí :

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

97voto

ewall Points 10676

Si vous avez déjà poussé certains de vos commits vers le dépôt public, vous faites no veulent le faire, ou cela ferait une version alternative de l'histoire du maître que d'autres ont pu utiliser. "Ne traversez pas les ruisseaux... Ce serait mauvais..."

Cela dit, s'il ne s'agit que des commits que vous avez faits dans votre dépôt local, alors corrigez-les avant de les pousser vers le serveur. Vous pouvez utiliser la fonction git filter-branch avec la commande --commit-filter pour qu'il édite seulement les commits qui correspondent à vos informations incorrectes, comme ceci :

git filter-branch --commit-filter '
      if [ "$GIT_AUTHOR_EMAIL" = "wrong_email@wrong_host.local" ];
      then
              GIT_AUTHOR_NAME="Your Name Here (In Lights)";
              GIT_AUTHOR_EMAIL="correct_email@correct_host.com";
              git commit-tree "$@";
      else
              git commit-tree "$@";
      fi' HEAD

66voto

8day Points 49

Envisager l'utilisation de git-filter-branch es non souhaité pour faire la même chose en git-filtre-repo (vous devrez peut-être l'installer d'abord avec pip install git-filter-repo ) :

git-filter-repo --name-callback 'return name.replace(b"OldName", b"NewName")' --email-callback 'return email.replace(b"old@email.com", b"new@email.com")'

Si le référentiel est d'origine, sans télécommande, vous devrez rajouter --force pour forcer la réécriture. (Vous pouvez vouloir créer une sauvegarde de votre repo avant de faire cela).

Si vous ne voulez pas conserver les refs (elles seront affichées dans l'historique des branches de l'interface graphique de Git), vous devrez ajouter --replace-refs delete-no-add .

Pour des fonctionnalités plus avancées, voir "Filtrage des noms et des e-mails" .

P.S. Volé et amélioré à partir de https://stackoverflow.com/a/59591928/714907 .

49voto

sarusso Points 436

Après avoir appliqué la réponse d'Olivier Verdier :

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

...pour pousser l'historique modifié sur l'utilisation du dépôt d'origine :

git push origin +yourbranch

La commande ci-dessus (notez le plus) force la réécriture de l'historique sur le repo original également. A utiliser avec précaution !

Encore une fois, AVERTISSEMENT : cela rendra TOUS les commits comme étant commis par NomNouveau/newemail ! Le scénario est le suivant : vous avez un repo avec un seul auteur qui a commis en utilisant différentes identités par erreur et vous voulez le corriger.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X