web-dev-qa-db-fra.com

Comment changer l'auteur du commit pour un commit spécifique?

Je veux changer l'auteur d'un commit spécifique dans l'historique. Ce n'est pas le dernier commit.

Je sais à propos de cette question - Comment puis-je changer l'auteur d'un commit en git?

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

1821
MicTech

Rebase interactive d'un point plus tôt dans l'historique que la validation à modifier (git rebase -i <earliercommit>). Dans la liste des commits en cours de rebasement, changez le texte de pick en edit en regard du hachage de celui que vous souhaitez modifier. Puis quand git vous invite à changer le commit, utilisez ceci:

git commit --amend --author="Author Name <[email protected]>"

Par exemple, si votre historique de validation est A-B-C-D-E-F avec F comme HEAD et que vous souhaitez changer l'auteur de C et D, alors vous le feriez. ..

  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 devez éditer A, utilisez git rebase -i --root
  2. changer les lignes pour C et D de pick à edit
  3. Une fois la base démarrée, la première pause serait effectuée à C
  4. Vous voudriez git commit --amend --author="Author Name <[email protected]>"
  5. Alors git rebase --continue
  6. Il ferait une nouvelle pause à D
  7. Ensuite, vous devriez à nouveau git commit --amend --author="Author Name <[email protected]>"
  8. git rebase --continue
  9. La rebase serait complète.
  10. Utilisez git Push -f pour mettre à jour votre origine avec les validations mises à jour.
3079
Amber

Le réponse acceptée à cette question est une utilisation merveilleusement intelligente de la base interactive, mais il présente malheureusement des conflits si le commit que nous essayons de changer d’auteur a été utilisé pour une branche qui a ensuite été fusionnée. Plus généralement, cela ne fonctionne pas lors du traitement d’histoires désordonnées.

Étant donné que je crains d’exécuter des scripts qui dépendent de la définition et de la désactivation des variables d’environnement pour réécrire l’historique de git, j’écris une nouvelle réponse sur la base de this post qui est similaire à cette réponse mais est plus complet.

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

  1. Commander le commit que nous essayons de modifier.

    git checkout 03f482d6
    
  2. Faites changer l'auteur.

    git commit --amend --author "New Author Name <New Author Email>"
    

    Nous avons maintenant un nouveau commit avec hash supposé être 42627abe.

  3. Commander la branche d'origine.

  4. Remplacez l'ancien commit localement par le nouveau.

    git replace 03f482d6 42627abe
    
  5. Réécrivez tous les commits futurs en fonction du remplacement.

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

    git replace -d 03f482d6
    
  7. Poussez le nouvel historique (utilisez uniquement --force si les opérations ci-dessous échouent, et uniquement après vérification de la cohérence avec git log et/ou git diff).

    git Push --force-with-lease
    

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

git rebase -i 42627abe
422
merlin2011

La documentation Github contient n script qui remplace les informations sur le commetteur pour tous les commits d'une branche .

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"

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 -- --branches --tags
189
olivieradam666
  • Réinitialisez votre email à la configuration globalement:

    git config --global user.email [email protected]

  • Maintenant, réinitialisez l’auteur de votre commit sans qu’il soit nécessaire de le modifier:

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

120
pravbeatle

Vous pouvez changer l'auteur du dernier commit en utilisant la commande ci-dessous.

git commit --amend --author="Author Name <[email protected]>"

Cependant, si vous voulez changer plus d'un nom d'auteur commit, c'est un peu délicat. Vous devez démarrer une base interactive, puis marquer les commits comme modification, les modifier un par un et terminer.

Commencez à rebaser avec git rebase -i. Il va vous montrer quelque chose comme ça.

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

Remplacez le mot clé pick par edit pour les commits pour lesquels vous souhaitez modifier le nom de l'auteur.

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

Fermez ensuite 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. Il est maintenant 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 à rebaser avec git rebase --continue. Répétez la même chose pour le nombre de validations que vous souhaitez modifier. Vous pouvez vous assurer que la réinitialisation interactive est terminée lorsque vous recevez le message No rebase in progress?.

76
Fatih

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 excuse pour essayer git filter-branch, j’ai écrit un script pour réécrire le nom de l’auteur et/ou le courrier électronique 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 <branch-to-rewrite> is not provided or is empty HEAD will be used.
#     Use "--all" or a space separated list (e.g. "master next") to rewrite
#     multiple branches.
#
#     If <new-name> (or <new-email>) is not provided or is empty, the normal
#     user.name (user.email) Git configuration value will be used.
#

force=''
if test "x$1" = "x-f"; 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
51
Chris Johnsen

S'engager avant:

enter image description here

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

git commit --amend --author="Author Name <[email protected]>"

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

git commit --amend --author=Eugen

S'engager après la commande:

enter image description here

Par exemple, pour tout changer à partir de 4025621:

enter image description here

Vous devez courir:

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

Remarque: pour inclure un auteur contenant des espaces tels qu'un nom et une adresse électronique, l'auteur doit être entouré de guillemets. Par exemple:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <[email protected]>\"" 4025621

ou ajoutez cet alias dans ~/.gitconfig:

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

Et puis courez:

git reauthor 4025621 Eugen
28
Eugen Konkov

Il y a une étape supplémentaire pour 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 que peu de personnes travaillent sur la même branche car cela risquerait de ruiner la cohérence.

15
Fabian76

Quand vous faites git rebase -i il y a ce bit intéressant dans le doc:

Si vous souhaitez plier deux ou plusieurs commits en un, remplacez la commande "pick" pour le deuxième et les suivants, par "squash" ou "fixup". Si les commit ont des auteurs différents, le commit plié sera attribué à l'auteur du premier commit. Le message de validation suggéré pour la validation pliée est la concaténation des messages de validation de la première validation et de ceux avec la commande "squash", mais en omettant les messages de validation des validations avec la commande "fixup".

  • Si vous avez une histoire de A-B-C-D-E-F,
  • 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 "[email protected]"
  • créer des commits vides (un pour chaque commit):
    • vous avez besoin d'un message à des fins de base
    • git commit --allow-empty -m "empty"
  • lancer l'opération de rebasage
    • git rebase -i B^
    • B^ sélectionne le parent de B.
  • vous voudrez mettre un commit vide avant chaque commit à modifier
  • vous voudrez changer pick en squash pour ceux-là.

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 en:

# 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 E-F alone
pick sha-commit-E some message
pick sha-commit-F some message

Il vous demandera d'éditer 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.

13
dnozay

En complément de la réponse Eugen Konkov , pour commencer à partir de la validation en racine, utilisez le drapeau --root. Le drapeau --no-edit est également utile

git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
5
korwalskiy

Si la validation que vous souhaitez modifier n'est pas la dernière, suivez les étapes ci-dessous. Si votre commit est dans une branche différente, passez d'abord à cette branche.

git checkout branch_name

Recherchez le commit avant le commit que vous souhaitez modifier et trouvez son hachage. Puis émettez la commande rebase.

git rebase -i -p hash de commit

Ensuite, un éditeur s’ouvre et saisit "edit" pour les commits que vous souhaitez modifier. Laissez les autres avec l'option 'pick' par défaut. Une fois modifié, entrez la touche 'esc' et wq! pour quitter.

Puis lancez la commande git commit avec l'option de modification.

git commit --amend --author = "Email de l'utilisateur" --no-edit

Puis lancez la commande suivante.

git rebase --continue

Une fois que l'auteur de la validation est mis à jour dans le référentiel local, transférez les modifications dans le référentiel distant.

1
ChannaB

Si ce que vous devez changer est l’AUTEUR DU DERNIER commit et qu’aucun autre n’utilise votre référentiel, vous pouvez annuler votre dernier commit avec:

git Push -f Origin last_commit_hash:branch_name 

changez le nom de l'auteur de votre commit avec:

git commit --amend --author "type new author here"

Quittez l'éditeur qui s'ouvre et Repoussez votre code:

git Push
1
pebox11

Il existe également une approche paresseuse de ce problème, surtout si vous souhaitez modifier plusieurs commit. Dans mon cas, j'avais une nouvelle branche avec plusieurs commits avec un mauvais auteur, alors qu'est-ce qui m'a aidé:

Allez à votre branche d'origine:

git checkout develop

en crée une nouvelle branche:

git checkout -b myFeature develop 

Fusionner sans information de commit comme un commit:

git merge --no-commit --squash branchWrongAuthor

Vous pouvez aussi vouloir mettre en scène les changements:

git stage .

Changer le nom de l'auteur et valider les modifications:

git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"

Et c'est tout, vous pouvez pousser les changements.

git Push

Vous pouvez ensuite supprimer la branche avec un auteur incorrect.

1
alexlz

Les étapes pour renommer le nom de l'auteur après la validation ont été validées.

  1. D'abord, tapez "git log" pour obtenir l'identifiant de validation et plus de détails.
  2. git rebase i HEAD ~ 10 (10 est le commit total à afficher sur rebase)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip)If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. Ensuite, tapez "git rebase - continue" ou "git rebase - support" selon vos besoins

    • maintenant votre fenêtre de rebase ouverte, cliquez sur la touche "i" du clavier
    • alors vous obtiendrez la liste des commits à 10 [parce que nous avons passé 10 commissions ci-dessus] Comme ci-dessous

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. Maintenant, vous devez ajouter la commande ci-dessous juste en dessous du commit que vous voulez éditer, comme ci-dessous

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <[email protected]>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <[email protected]>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <[email protected]>'

    1. Ça y est, maintenant il suffit d'appuyer sur ESC,: wq et vous êtes tous ensemble

    2. Puis git Push Origin HEAD: NOM DE LA BRANCHE -f [veuillez prendre soin de -f Force Push]

0
Kirtikumar A.