Ik wil de auteur van één specifieke commit in de geschiedenis veranderen. Het is niet de laatste commit.
Ik weet van deze vraag - Hoe verander ik de auteur van een commit in git?
Maar ik denk aan iets, waarbij ik de commit identificeer door hash of short-hash.
Interactieve rebase van een punt eerder in de geschiedenis dan de commit die je wilt wijzigen (git rebase -i <earliercommit>
). In de lijst van commits die gerebaset worden, verander je de tekst van pick
naar edit
naast de hash van de commit die je wilt wijzigen. Als git je dan vraagt om de commit te veranderen, gebruik dan dit:
git commit --amend --author="Author Name <[email protected]>"
Bijvoorbeeld, als je commit geschiedenis A-B-C-D-E-F
is met F
als HEAD
, en je wilt de auteur van C
en D
veranderen, dan zou je...
git rebase -i B
op (hier is een voorbeeld van wat je te zien krijgt na het uitvoeren van het git rebase -i B
commando)A
moet bewerken, gebruik dan git rebase -i --root
C
als D
van pick
in edit
C
git commit --amend --author="Author Name <[email protected]>"
git rebase --continue
D
git commit --amend --author="Author Name <[email protected]>"
weer doengit rebase --continue
git push -f
om je origin bij te werken met de bijgewerkte commits.De antwoorden in de vraag waarnaar je linkte zijn goede antwoorden en dekken jouw situatie (de andere vraag is algemener omdat het gaat om het herschrijven van meerdere commits).
Als een excuus om git filter-branch
uit te proberen, heb ik een script geschreven om de Auteur Naam en/of Email van de Auteur voor een gegeven commit te herschrijven:
#!/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
Als je git rebase -i
doet, staat er dit interessante stukje in de doc:
Als je twee of meer commits in één wilt vouwen, vervang dan het commando
"pick"
voor de tweede en volgende commits door"squash"
of"fixup"
. Als de commits verschillende auteurs hadden, dan zal de geplooide commit aan de auteur van de eerste commit toegeschreven worden. De voorgestelde commit boodschap voor de gevouwen commit is de aaneenschakeling van de commit boodschappen van de eerste commit en van die met het"squash"
commando, maar laat de commit boodschappen van commits met het"fixup"
commando weg.
A-B-C-D-E-F
,B
en D
(= 2 commits) wijzigen,dan kun je dat doen:
git config user.name "Correct new name"
git config user.email "[email protected]"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
selecteert de ouder van B
.pick
in squash
moeten veranderen voor deze.Voorbeeld van wat git rebase -i B^
je zal geven:
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
verander dat in:
# 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
Het zal u vragen om de berichten te bewerken:
# 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...
en je kunt gewoon de eerste paar regels verwijderen.