Frage Wie ändere ich den Commit-Autor für einen bestimmten Commit?
Ich möchte den Autor eines bestimmten Commits in der Geschichte ändern. Es ist nicht das letzte Commit.
Ich weiß über diese Frage - Wie ändere ich den Autor eines Commits in git?
Aber ich denke über etwas nach, wo ich das Commit durch Hash oder Short-Hash identifiziere.
1380
2018-06-15 04:00
Ursprung
Antworten:
Interaktive Wiederherstellung von einem früheren Punkt in der History als der Commit, den Sie ändern müssen (git rebase -i <earliercommit>
). In der Liste der Commits, die rebasiert werden, ändern Sie den Text von pick
zu edit
neben dem Hash desjenigen, den Sie ändern möchten. Wenn git Sie dann auffordert, das Commit zu ändern, verwenden Sie Folgendes:
git commit --amend --author="Author Name <email@address.com>"
Zum Beispiel, wenn Ihr Commit-Verlauf ist A-B-C-D-E-F
mit F
wie HEAD
, und Sie möchten den Autor von ändern C
und D
Dann würdest du ...
- Angeben
git rebase -i B
(Hier sehen Sie ein Beispiel für das, was Sie nach der Ausführung von git rebase -i B
Befehl)
- wenn Sie bearbeiten müssen
A
, benutzen git rebase -i --root
- Ändern Sie die Linien für beide
C
und D
von pick
zu edit
- Sobald die Rebase gestartet wurde, würde sie zuerst pausieren
C
- Du würdest
git commit --amend --author="Author Name <email@address.com>"
- Dann
git rebase --continue
- Es würde wieder bei pausieren
D
- Dann würdest du es tun
git commit --amend --author="Author Name <email@address.com>"
nochmal
git rebase --continue
- Die Rebase würde vervollständigt werden.
2315
2018-06-15 04:31
Das akzeptierte Antwort zu dieser Frage ist eine wunderbar schlaue Verwendung von interaktiven Rebase, aber es zeigt leider Konflikte, wenn das Commit, das wir versuchen, den Autor zu ändern, auf einem Zweig war, der später zusammengeführt wurde. Allgemeiner funktioniert es nicht, wenn unordentlich gehandhabt wird Geschichten.
Da ich Bedenken habe, Skripte auszuführen, die von der Einstellung und Unscharfschaltung von Umgebungsvariablen abhängen, schreibe ich eine neue Antwort auf dieser Beitrag das ist ähnlich diese Antwort aber ist vollständiger.
Das Folgende ist getestet und funktioniert, anders als die verknüpfte Antwort.
Nehmen Sie zur Klarheit der Darstellung an, dass 03f482d6
ist das Commit, dessen Autor wir zu ersetzen versuchen, und 42627abe
ist das Commit mit dem neuen Autor.
Überprüfen Sie das Commit, das wir ändern möchten.
git checkout 03f482d6
Ändern Sie den Autor.
git commit --amend --author "New Author Name <New Author Email>"
Jetzt haben wir ein neues Commit mit Hash angenommen 42627abe
.
Überprüfen Sie den ursprünglichen Zweig.
Ersetzen Sie das alte Commit lokal durch das neue.
git replace 03f482d6 42627abe
Schreiben Sie alle zukünftigen Commits basierend auf der Ersetzung neu.
git filter-branch -- --all
Entfernen Sie den Ersatz für Sauberkeit.
git replace -d 03f482d6
Drücken Sie den neuen Verlauf (verwenden Sie nur --force, wenn der folgende Fehler auftritt, und erst nach der Überprüfung der Integrität mit git log
und / oder git diff
).
git push --force-with-lease
Statt 4-6 können Sie einfach auf neues Commit rebasieren:
git rebase -i 42627abe
311
2018-03-04 02:11
Github-Dokumentation enthält Ein Skript, das die Committer-Informationen für alle Commits in einer Verzweigung ersetzt.
#!/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
Sie können den Autor des letzten Commits mit dem folgenden Befehl ändern.
git commit --amend --author="Author Name <email@address.com>"
Wenn Sie jedoch mehr als einen Commit-Autorennamen ändern möchten, ist es ein bisschen schwierig. Sie müssen eine interaktive Rebase starten, dann commits als edit markieren und sie dann nacheinander bearbeiten und beenden.
Beginne mit dem Rebasing git rebase -i
. Es wird dir so etwas zeigen.

Ändere das pick
Schlüsselwort zu edit
Für die Commits möchten Sie den Autorennamen ändern.

Dann schließe den Editor. Für die Anfänger, Hit Escape
dann tippe ein :wq
und hit Enter
.
Dann werden Sie Ihr Terminal sehen, als wäre nichts passiert. Eigentlich sind Sie mitten in einer interaktiven Rebase. Jetzt ist es Zeit, den Autorennamen des Commits mit dem obigen Befehl zu ändern. Es öffnet den Editor erneut. Beenden und Fortsetzen von Rebase mit git rebase --continue
. Wiederholen Sie dies für die Anzahl der Commits, die Sie bearbeiten möchten. Sie können sicherstellen, dass die interaktive Umbenennung abgeschlossen ist, wenn Sie die No rebase in progress?
Botschaft.
60
2017-08-29 00:52
Setzen Sie Ihre E-Mail global auf die Konfiguration zurück:
git config --global user.email example@email.com
Setzen Sie nun den Autor Ihres Commits zurück, ohne dass eine Bearbeitung erforderlich ist:
git commit --amend --reset-author --no-edit
52
2018-04-05 12:44
Die Antworten in der Frage, auf die Sie verlinken, sind gute Antworten und decken Ihre Situation ab (die andere Frage ist allgemeiner, da es sich um das Neuschreiben mehrerer Commits handelt).
Als Ausrede zum Ausprobieren git filter-branch
Ich habe ein Skript geschrieben, um den Autornamen und / oder die Autoren-E-Mail für ein bestimmtes Commit neu zu schreiben:
#!/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
Wenn es geht git rebase -i
Es gibt dieses interessante Stück im Dokument:
Wenn Sie zwei oder mehr Commits zu einem falten möchten, ersetzen Sie den Befehl "pick"
für die zweite und nachfolgende Commits mit "squash"
oder "fixup"
. Wenn die Commits unterschiedliche Autoren hatten, wird der gefaltete Commit dem Autor des ersten Commits zugeordnet. Die vorgeschlagene Commit - Nachricht für das gefaltete Commit ist die Verkettung der Commit - Nachrichten des ersten Commits und derjenigen mit dem "squash"
Befehl, aber die Commit - Nachrichten von Commits mit dem "fixup"
Befehl.
- Wenn Sie eine Geschichte von haben
A-B-C-D-E-F
,
- und Sie möchten die Commits ändern
B
und D
(= 2 commits),
dann kannst du:
git config user.name "Correct new name"
git config user.email "correct@new.email"
- Erstellen Sie leere Commits (eine für jedes Commit):
- Sie benötigen eine Nachricht für den Verwendungszweck
git commit --allow-empty -m "empty"
- Starten Sie die Rebase-Operation
git rebase -i B^
B^
wählt das übergeordnete Element aus B
.
- Du wirst ein leeres Commit machen wollen Vor jeder verpflichtet sich zu modifizieren
- du wirst dich ändern wollen
pick
zu squash
für diejenigen.
Beispiel für was git rebase -i B^
werde dir geben:
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 zu:
# 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 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 nur die ersten paar Zeilen entfernen.
12
2017-08-28 01:03
Es gibt einen zusätzlichen Schritt zu Ambers Antwort wenn Sie ein zentralisiertes Repository verwenden:
git push -f
Erzwingen der Aktualisierung des zentralen Repository.
Achten Sie darauf, dass nicht viele Personen in derselben Branche arbeiten, da dies die Konsistenz beeinträchtigen kann.
11
2017-12-20 15:06
Commit vorher:

Um den Autor für alle Commits zu fixieren, können Sie den Befehl von @ Ambers Antwort anwenden:
git commit --amend --author="Author Name <email@address.com>"
Oder um Ihren Namen und Ihre E-Mail-Adresse wiederzuverwenden, können Sie einfach schreiben:
git commit --amend --author=Eugen
Commit nach dem Befehl:

Zum Beispiel um alle von beginnen zu ändern 4025621
:

Du musst rennen:
git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621
oder füge diesen Alias hinzu ~/.gitconfig
:
[alias]
reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --
Und dann:
git reauthor 4025621 Eugen
1
2018-06-30 12:16