Je veux changer l'auteur d'un commit spécifique dans l'historique. Ce n'est pas le dernier commit.
Je connais cette question - [Comment changer l'auteur d'un commit dans git ?][1]
Mais je pense à quelque chose, où j'identifie le commit par un hash ou un short-hash.
[1] : https://stackoverflow.com/questions/750172/how-do-i-change-the-author-of-a-commit-in-git
Rebase interactif à partir d'un point plus tôt dans l'historique que le commit que vous devez modifier (git rebase -i <earliercommit>
). Dans la liste des commits en cours de rebasement, changez le texte de pick
en edit
à côté du hash de celui que vous voulez modifier. Ensuite, lorsque git vous demande de modifier le commit, utilisez ceci :
git commit --amend --author="Author Name <[email protected]>"
Par exemple, si votre historique de commit est A-B-C-D-E-F
avec F
comme HEAD
, et que vous voulez changer l'auteur de C
et D
, alors vous devez...
git rebase -i B
(voici un exemple de ce que vous verrez après avoir exécuté la commande git rebase -i B
)A
, utilisez git rebase -i --root
C
et D
de pick
en edit
.C
.git commit --amend --author="Nom de l'auteur <[email protected]>"
git rebase --continue
.D
.git commit --amend --author="Nom de l'auteur <[email protected]>"
à nouveau.git rebase --continue
git push -f
pour mettre à jour votre origine avec les commits mis à jour.Les réponses à la question à laquelle vous avez fait un lien sont de bonnes réponses et couvrent votre situation (l'autre question est plus générale puisqu'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 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
Lorsque vous faites git rebase -i
, il y a cette partie intéressante dans la doc :
Si vous voulez plier deux ou plusieurs commits en un seul, remplacez la commande
"pick"
pour le second commit et les suivants par"squash"
ou"fixup"
. Si les commits ont des auteurs différents, le commit plié sera attribué à l'auteur du premier commit. Le message de commit suggéré pour le commit replié est la concaténation des messages de commit du premier commit et de ceux avec la commande"squash"
, mais omet les messages de commit des commits avec la commande"fixup"
.
A-B-C-D-E-F
,B
et D
(= 2 commits),alors vous pouvez le faire :
git config user.name "Corriger le nouveau nom"
git config user.email "[email protected]"
git commit --allow-empty -m "empty"
B^
sélectionne le parent de B
.pick
en squash
pour ceux-ci.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
changez 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
Vous serez invité à 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 juste enlever les premières lignes.