Question Comment changer l'auteur de validation pour une validation spécifique?


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

Je sais à propos de 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.


1380
2018-06-15 04:00


origine


Réponses:


Rebase interactif d'un point plus tôt dans l'histoire que le commit que vous devez modifier (git rebase -i <earliercommit>). Dans la liste des validations en cours de modification, changez le texte de pick à edit à côté du hachage de celui que vous voulez modifier. Ensuite, quand git vous invite à changer le commit, utilisez ceci:

git commit --amend --author="Author Name <email@address.com>"

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

  1. Spécifier git rebase -i B (Voici un exemple de ce que vous verrez après l'exécution du git rebase -i B commander)
    • si vous avez besoin de modifier A, utilisation git rebase -i --root
  2. changer les lignes pour les deux C et D de pick à edit
  3. Une fois le rebas commencé, il se mettra d'abord en pause C
  4. Vous voudriez git commit --amend --author="Author Name <email@address.com>"
  5. alors git rebase --continue
  6. Il ferait de nouveau une pause à D
  7. Ensuite, vous le feriez git commit --amend --author="Author Name <email@address.com>" encore
  8. git rebase --continue
  9. La rebase serait complète.

2315
2018-06-15 04:31



le réponse acceptée à cette question est une utilisation merveilleusement intelligente de rebase interactif, mais il présente malheureusement des conflits si le commit que nous essayons de changer l'auteur de l'habitude d'être sur une branche qui a ensuite fusionné. Plus généralement, cela ne fonctionne pas lors de la manipulation désordonnée histoires.

Comme 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 git, j'écris une nouvelle réponse basée sur ce 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'exposition que 03f482d6 est le commit dont nous essayons de remplacer l'auteur, et 42627abe est le commit avec le nouvel auteur.

  1. Checkout 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>"
    

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

  3. Commander la branche d'origine.

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

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

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

    git replace -d 03f482d6
    
  7. Poussez le nouvel historique (n'utilisez que --force si la fonction ci-dessous échoue, et seulement après vérification de la santé 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

311
2018-03-04 02:11



La documentation de Github contient un script qui remplace les informations du committer pour toutes les validations dans une branche.

#!/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 -- --branches --tags

128
2018-06-09 16:02



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

git commit --amend --author="Author Name <email@address.com>"

Cependant, si vous voulez changer plus d'un nom d'auteur, c'est un peu compliqué. Vous devez démarrer un rebasage interactif puis marquer commet comme éditer puis les amender un par un et finir.

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

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

Changer la pick mot-clé pour edit pour les commits, vous voulez changer le nom de l'auteur.

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

Puis fermez l'éditeur. Pour les débutants, cliquez Escape puis tapez :wq et frapper Enter.

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


60
2017-08-29 00:52



  • Réinitialisez votre email à la config globalement:

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

  • Maintenant, réinitialisez l'auteur de votre commit sans le modifier:

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


52
2018-04-05 12:44



Les réponses dans 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 une excuse pour essayer git filter-branch, J'ai écrit un script pour réécrire le nom de l'auteur et / ou l'email 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

46
2018-06-15 05:24



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

Si vous voulez plier deux ou plusieurs commits en un, remplacez la commande "pick" pour le deuxième et les suivants commits avec "squash" ou "fixup". Si les commits 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 du premier commit et de ceux avec le "squash" commande, mais omet les messages de validation de commits avec le "fixup" commander.

  • Si vous avez un historique de A-B-C-D-E-F,
  • et vous voulez changer de 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 validations vides (une pour chaque validation):
    • vous avez besoin d'un message pour le but de rebasage
    • git commit --allow-empty -m "empty"
  • démarrer l'opération de rebasage
    • git rebase -i B^
    • B^ sélectionne le parent de B.
  • vous voudrez mettre un commit vide avant chacun s'engage à modifier
  • vous voudrez changer pick à squash pour ceux.

Exemple de quoi git rebase -i B^ te 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 E-F alone
pick sha-commit-E some message
pick sha-commit-F some message

Il vous invitera à 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.


12
2017-08-28 01:03



Il y a une étape supplémentaire à La réponse d'Amber Si vous utilisez un référentiel centralisé:

git push -f 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 branche car cela peut gâcher la cohérence.


11
2017-12-20 15:06



Commettez avant:

enter image description here

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

git commit --amend --author="Author Name <email@address.com>"

Ou pour réutiliser votre nom et votre adresse e-mail, vous pouvez simplement écrire:

git commit --amend --author=Eugen

Validez 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

ou ajoutez cet alias dans ~/.gitconfig:

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

Et puis exécutez:

git reauthor 4025621 Eugen

1
2018-06-30 12:16