Ich möchte den Autor eines bestimmten Commits in der Historie ändern. Es ist nicht der letzte Commit.
Ich weiß von dieser Frage - Wie ändere ich den Autor eines Commits in Git?
Aber ich denke an etwas, bei dem ich den Commit durch einen Hash oder Short-Hash identifizieren kann.
Interaktives rebase von einem Punkt aus, der früher in der Historie liegt als der zu ändernde Commit (git rebase -i <earliercommit>
). Ändern Sie in der Liste der Commits, die rebase sind, den Text neben dem Hash des Commits, den Sie ändern wollen, von pick
auf edit
. Wenn Git Sie dann auffordert, den Commit zu ändern, verwenden Sie dies:
git commit --amend --author="Author Name <[email protected]>"
Wenn Ihre Commit-Historie zum Beispiel A-B-C-D-E-F
mit F
als HEAD
ist, und Sie den Autor von C
und D
ändern wollen, dann würden Sie...
git rebase -i B
an (hier ist ein Beispiel dafür, was Sie nach der Ausführung des Befehls git rebase -i B
sehen werden)A
bearbeiten müssen, verwenden Sie git rebase -i --root
C
und D
von pick
auf edit
C
pausieren.git commit --amend --author="Autorenname <[email protected]>"
git rebase --continue
D
pausierengit commit --amend --author="Autorenname <[email protected]>"
erneut durchführengit rebase --continue
git push -f
, um Ihren Ursprung mit den aktualisierten Übertragungen zu aktualisieren.Die Antworten in der Frage, die Sie verlinkt haben, sind gute Antworten und decken Ihre Situation ab (die andere Frage ist allgemeiner, da sie das Umschreiben mehrerer Commits beinhaltet).
Um git filter-branch
auszuprobieren, habe ich ein Skript geschrieben, das den Autorennamen und/oder die Autoren-E-Mail für einen bestimmten Commit umschreibt:
#!/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
Wenn man git rebase -i
macht, gibt es diese interessante Stelle in der Dokumentation:
Wenn Sie zwei oder mehr Commits zu einem falten wollen, ersetzen Sie den Befehl
"pick"
für den zweiten und die folgenden Commits durch"squash"
oder"fixup"
. Wenn die Commits unterschiedliche Autoren hatten, wird der gefaltete Commit dem Autor des ersten Commits zugeschrieben. Die vorgeschlagene Commit-Nachricht für den gefalteten Commit ist die Verkettung der Commit-Nachrichten des ersten Commits und der Commits mit dem"squash"
-Befehl, lässt aber die Commit-Nachrichten der Commits mit dem `"fixup"-Befehl aus.
A-B-C-D-E-F
haben,B
und D
(= 2 Commits) ändern,dann können Sie das tun:
git config user.name "Korrekter neuer Name"
git config user.email "[email protected]"
git commit --allow-empty -m "leer"
git rebase -i B^
B^
wählt den Elternteil von B
aus.pick
in squash
für diese ändern wollen.Ein Beispiel dafür, was git rebase -i B^
Ihnen geben wird:
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
ändere das 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
Sie werden dann aufgefordert, die Nachrichten zu bearbeiten:
# 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...
und Sie können einfach die ersten paar Zeilen entfernen.