Comment changer l’auteur de la validation pour un commit spécifique?

Je veux changer l’auteur d’un commit spécifique dans l’histoire. Ce n’est pas le dernier engagement.

Je connais cette question – Comment changer l’auteur d’un commit en git?

Mais je pense à quelque chose, où j’identifie le commit par hash ou short-hash.

Redémarrage interactif à un moment antérieur de l’historique que la validation à modifier ( git rebase -i ). Dans la liste des validations rebasées, modifiez le texte de pick pour edit côté du hachage de celui que vous souhaitez modifier. Ensuite, lorsque git vous invite à modifier le commit, utilisez ceci:

 git commit --amend --author="Author Name " 

Par exemple, si votre historique de validation est ABCDEF avec F comme HEAD et que vous voulez changer l’auteur de C et D , alors vous …

  1. Spécifiez git rebase -i B ( voici un exemple de ce que vous verrez après l’exécution de la commande git rebase -i B )
    • si vous avez besoin d’éditer A , utilisez git rebase -i --root
  2. changer les lignes à la fois pour C et D de pick pour edit
  3. Une fois la rebase lancée, elle s’arrêtait d’abord à C
  4. Vous voulez git commit --amend --author="Author Name "
  5. Puis git rebase --continue
  6. Il s’arrêterait à nouveau à D
  7. Ensuite, vous vous git commit --amend --author="Author Name " nouveau
  8. git rebase --continue
  9. Le rebase serait complet.

La réponse acceptée à cette question est une utilisation merveilleusement intelligente du rebase interactif, mais il présente malheureusement des conflits si le commit que nous essayons de changer était l’auteur d’une twig qui a été fusionnée par la suite. Plus généralement, cela ne fonctionne pas lors de la gestion des histoires en désordre.

Étant donné que je crains de devoir exécuter des scripts qui dépendent de la définition et de la suppression des variables d’environnement pour réécrire l’historique de git, j’écris une nouvelle réponse basée sur cet article, similaire à cette réponse mais plus complète.

Ce qui suit est testé et fonctionne, contrairement à la réponse liée. Supposons, pour plus de clarté, que 03f482d6 est le commit dont nous essayons de remplacer l’ 42627abe et que 42627abe est le commit avec le nouvel auteur.

  1. Vérifiez le commit que nous essayons de modifier.

     git checkout 03f482d6 
  2. Faites que l’auteur change.

     git commit --amend --author "New Author Name " 

    Maintenant, nous avons un nouveau commit avec hash supposé être 42627abe .

  3. Commander la twig d’origine.

  4. Remplacez l’ancien commit par le nouveau en local.

     git replace 03f482d6 42627abe 
  5. Réécrire tous les futurs commits basés sur le remplacement.

     git filter-branch -- --all 
  6. Retirez le remplacement pour la propreté.

     git replace -d 03f482d6 
  7. Appuyez sur le nouvel historique (utilisez uniquement –force si le problème ci-dessous échoue, et uniquement après une vérification de la git log avec git log et / ou git diff ).

     git push --force-with-lease 

Au lieu de 4-6, vous pouvez simplement rebaser sur un nouveau commit:

 git rebase -i 42627abe 

La documentation Github contient un script qui remplace les informations de committer pour tous les commits dans une twig .

 #!/bin/sh git filter-branch --env-filter ' OLD_EMAIL="your-old-email@example.com" CORRECT_NAME="Your Correct Name" CORRECT_EMAIL="your-correct-email@example.com" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' --tag-name-filter cat -- --twigs --tags 

Vous pouvez changer l’auteur de la dernière validation en utilisant la commande ci-dessous.

git commit --amend --author="Author Name "

Cependant, si vous souhaitez modifier plus d’un nom d’auteur, c’est un peu compliqué. Vous devez lancer un rebase interactif, puis marquer les commits comme édités, puis les modifier un par un et terminer.

Commencez à rebaser avec git rebase -i . Cela vous montrera quelque chose comme ça.

http://soffr.miximages.com/git/2908150343-77gex.png

Modifiez le mot-clé pick pour le edit pour les commits dont vous souhaitez modifier le nom d’auteur.

http://soffr.miximages.com/git/2908150344-ii246.png

Puis fermez l’éditeur. Pour les débutants, appuyez sur Escape puis tapez :wq et appuyez sur Enter .

Ensuite, vous verrez votre terminal comme si rien ne s’était passé. En fait, vous êtes au milieu d’une rebase interactive. Maintenant, il est temps de modifier le nom de l’auteur de votre commit en utilisant la commande ci-dessus. Cela ouvrira l’éditeur à nouveau. Quittez et continuez rebase avec git rebase --continue . Répétez la même chose pour le compte de validation à modifier. Vous pouvez vous assurer que le rebase interactif est terminé lorsque vous obtenez le No rebase in progress? message.

  • Réinitialisez votre email à la configuration globale:

    git config --global user.email example@email.com

  • Maintenant, réinitialisez l’auteur de votre validation sans modifier:

    git commit --amend --reset-author --no-edit

Les réponses à la question à laquelle vous avez lié sont de bonnes réponses et couvrent votre situation (l’autre question est plus générale car elle implique la réécriture de plusieurs commits).

Comme prétexte pour essayer git filter-branch , j’ai écrit un script pour réécrire le nom de l’auteur et / ou le courriel de l’auteur pour un commit donné:

 #!/bin/sh # # Change the author name and/or email of a single commit. # # change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]] # # If -f is supplied it is passed to "git filter-branch". # # If  is not provided or is empty HEAD will be used. # Use "--all" or a space separated list (eg "master next") to rewrite # multiple twigs. # # If  (or ) is not provided or is empty, the normal # user.name (user.email) Git configuration value will be used. # force='' if test "x$1" = "xf"; then force='-f' shift fi die() { printf '%s\n' "$@" exit 128 } targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit" br="${2:-HEAD}" TARG_COMMIT="$targ" TARG_NAME="${3-}" TARG_EMAIL="${4-}" export TARG_COMMIT TARG_NAME TARG_EMAIL filt=' if test "$GIT_COMMIT" = "$TARG_COMMIT"; then if test -n "$TARG_EMAIL"; then GIT_AUTHOR_EMAIL="$TARG_EMAIL" export GIT_AUTHOR_EMAIL else unset GIT_AUTHOR_EMAIL fi if test -n "$TARG_NAME"; then GIT_AUTHOR_NAME="$TARG_NAME" export GIT_AUTHOR_NAME else unset GIT_AUTHOR_NAME fi fi ' git filter-branch $force --env-filter "$filt" -- $br 

En faisant git rebase -i il y a ce bit intéressant dans le doc:

Si vous voulez plier deux commits ou plus en un seul, remplacez la commande "pick" pour la seconde et les validations suivantes par "squash" ou "fixup" . Si les commits ont des auteurs différents, le commit plié sera atsortingbué à l’auteur du premier commit. Le message de validation suggéré pour le commit plié est la concaténation des messages de validation du premier commit et de ceux avec la commande "squash" , mais omet les messages de validation des commits avec la commande "fixup" .

  • Si vous avez un historique de ABCDEF ,
  • et vous voulez changer les commits B et D (= 2 commits),

alors vous pouvez faire:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • créer des commits vides (un pour chaque commit):
    • vous avez besoin d’un message à des fins de rebase
    • git commit --allow-empty -m "empty"
  • lance l’opération de rebase
    • git rebase -i B^
    • B^ sélectionne le parent de B
  • vous voudrez mettre un commit vide avant chaque engagement à modifier
  • vous voudrez changer le pick pour le squash pour ceux.

Exemple de ce que git rebase -i B^ vous donnera:

 pick sha-commit-B some message pick sha-commit-C some message pick sha-commit-D some message pick sha-commit-E some message pick sha-commit-F some message # pick sha-commit-empty1 empty # pick sha-commit-empty2 empty 

changer cela pour:

 # change commit B's author pick sha-commit-empty1 empty squash sha-commit-B some message # leave commit C alone pick sha-commit-C some message # change commit D's author pick sha-commit-empty2 empty squash sha-commit-D some message # leave commit EF alone pick sha-commit-E some message pick sha-commit-F some message 

Il vous demandera de modifier les messages:

 # This is a combination of 2 commits. # The first commit's message is: empty # This is the 2nd commit message: ...some useful commit message there... 

et vous pouvez simplement supprimer les premières lignes.

Il y a une étape supplémentaire à la réponse d’ Amber si vous utilisez un référentiel centralisé:

git push -f pour forcer la mise à jour du référentiel central.

Veillez à ce qu’il n’y ait pas beaucoup de personnes travaillant sur la même twig, car cela peut gâcher la cohérence.

S’engager avant:

entrer la description de l'image ici

Pour corriger l’auteur de tous les commits, vous pouvez appliquer la commande de la réponse de @ Amber:

 git commit --amend --author="Author Name " 

Ou pour réutiliser votre nom et email, vous pouvez simplement écrire:

 git commit --amend --author=Eugen 

S’engager après la commande:

entrer la description de l'image ici

Par exemple pour tout changer à partir de 4025621 :

entrer la description de l'image ici

Vous devez courir:

 git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621 

ou ajoutez cet alias dans ~/.gitconfig :

 [alias] reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' -- 

Et puis lancez:

 git reauthor 4025621 Eugen