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.
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. ..
git rebase -i B
( voici un exemple de ce que vous verrez après l'exécution de la commande git rebase -i B
) ) A
, utilisez git rebase -i --root
C
et D
de pick
à edit
C
git commit --amend --author="Author Name <[email protected]>"
git rebase --continue
D
git commit --amend --author="Author Name <[email protected]>"
git rebase --continue
git Push -f
pour mettre à jour votre origine avec les validations mises à jour.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.
Commander le commit que nous essayons de modifier.
git checkout 03f482d6
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
.
Commander la branche d'origine.
Remplacez l'ancien commit localement par le nouveau.
git replace 03f482d6 42627abe
Réécrivez tous les commits futurs en fonction du remplacement.
git filter-branch -- --all
Retirez le remplacement pour la propreté.
git replace -d 03f482d6
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
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
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
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.
Remplacez le mot clé pick
par edit
pour les commits pour lesquels vous souhaitez modifier le nom de l'auteur.
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?
.
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
S'engager avant:
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:
Par exemple, pour tout changer à partir de 4025621
:
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
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.
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"
.
A-B-C-D-E-F
,B
et D
(= 2 commits),alors vous pouvez faire:
git config user.name "Correct new name"
git config user.email "[email protected]"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
sélectionne le parent de B
.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.
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"
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.
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
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.
Les étapes pour renommer le nom de l'auteur après la validation ont été validées.
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.
Ensuite, tapez "git rebase - continue" ou "git rebase - support" selon vos besoins
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
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]>'
Ça y est, maintenant il suffit d'appuyer sur ESC,: wq et vous êtes tous ensemble
Puis git Push Origin HEAD: NOM DE LA BRANCHE -f [veuillez prendre soin de -f Force Push]