
Flavio Amieiro
Ich schrieb ein einfaches Skript auf dem Schulcomputer und übergab die Änderungen an Git (in einem Repo, das sich auf meinem USB-Stick befand und von meinem Computer zu Hause geklont wurde). Nach mehreren Commits wurde mir klar, dass ich Dinge als Root-Benutzer committete.
Gibt es eine Möglichkeit, den Autor dieser Commits auf meinen Namen zu ändern?

Pat Notz
Diese Antwort verwendet git-filter-branch
wofür die Dokumente nun diese Warnung:
git filter-branch hat eine Fülle von Fallstricken, die zu nicht offensichtlichen Verstümmelungen der beabsichtigten Umschreibung des Verlaufs führen können (und Ihnen aufgrund der miserablen Leistung wenig Zeit lassen können, solche Probleme zu untersuchen). Diese Sicherheits- und Leistungsprobleme können nicht abwärtskompatibel behoben werden und daher wird ihre Verwendung nicht empfohlen. Bitte verwenden Sie ein alternatives Verlaufsfilter-Tool wie z git filter-repo. Wenn Sie immer noch git filter-branch verwenden müssen, lesen Sie bitte sorgfältig SICHERHEIT (und LEISTUNG), um mehr über die Landminen von Filter-Branch zu erfahren, und vermeiden Sie dann wachsam so viele der dort aufgeführten Gefahren wie vernünftigerweise möglich.
Das Ändern des Autors (oder Committers) würde ein Neuschreiben des gesamten Verlaufs erfordern. Wenn Sie damit einverstanden sind und denken, dass es sich lohnt, sollten Sie es überprüfen git filter-branch. Die Manpage enthält mehrere Beispiele, um Ihnen den Einstieg zu erleichtern. Beachten Sie auch, dass Sie Umgebungsvariablen verwenden können, um den Namen des Autors, des Bearbeiters, des Datums usw. zu ändern — siehe Abschnitt “Umgebungsvariablen” der git Manpage.
Insbesondere können Sie alle falschen Autorennamen und E-Mail-Adressen korrigieren für alle Branchen und Tags mit diesem Befehl (Quelle: GitHub-Hilfe):
#!/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
Für die Verwendung des alternativen Verlaufsfiltertools git filter-repokönnen Sie es zuerst installieren und eine erstellen git-mailmap
nach dem Format von gitmailmap.
Proper Name <proper@email.xx> Commit Name <commit@email.xx>
Führen Sie dann filter-repo mit der erstellten Mailmap aus:
git filter-repo --mailmap git-mailmap

Rognon
Sie können auch Folgendes tun:
git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
then
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
Beachten Sie, wenn Sie diesen Befehl in der Windows-Eingabeaufforderung verwenden, müssen Sie verwenden "
anstatt '
:
git filter-branch --commit-filter "
if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
then
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi" HEAD

Eisen9
Es passiert, wenn Sie keine haben $HOME/.gitconfig
initialisiert. Sie können dies wie folgt beheben:
git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author
Getestet mit Git-Version 1.7.5.4.
Beachten Sie, dass dies nur den letzten Commit behebt.

Inanc Gumus
Für den Fall, dass nur die oberen paar Commits schlechte Autoren haben, können Sie dies alles intern tun git rebase -i
Verwendung der exec
Befehl und die --amend
begehen, wie folgt:
git rebase -i HEAD~6 # as required
was Ihnen die bearbeitbare Liste der Commits präsentiert:
pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2
Dann füge hinzu exec ... --author="..."
Zeilen nach allen Zeilen mit schlechten Autoren:
pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
Editor speichern und beenden (zum Ausführen).
Diese Lösung ist möglicherweise länger zu tippen als einige andere, aber sie ist sehr gut kontrollierbar – ich weiß genau, auf welche Commits sie trifft.
Danke an @asmeurer für die Inspiration.
9877300cookie-checkWie ändere ich den Namen und die E-Mail-Adresse des Autors und Committers mehrerer Commits in Git?yes
Frage: Behält die Verwendung von git filter-branch die SHA1-Werte für frühere Tags, Versionen und Objekte bei? Oder erzwingt eine Änderung des Autorennamens auch eine Änderung der zugehörigen SHA1s?
– AndyL
3. August 2010 um 14:13 Uhr
Hashes werden sich ja ändern
– Nicht verfügbar
14. Oktober 2010 um 15:16 Uhr
Tangential erstellte ich ein kleines Skript, das endlich die Ursache für mich behebt. gist.github.com/triplee/16767aa4137706fd896c
– Dreier
30. Mai 2014 um 8:51 Uhr
@impinball Das Alter der Frage ist kaum relevant. Das Erstellen einer neuen doppelten Frage kommt nicht in Frage. Ich nehme an, ich könnte eine Frage erstellen, die diese spezielle Antwort verlangt, aber ich bin nicht ganz davon überzeugt, dass sie so viel Sichtbarkeit erhalten würde. Es ist ja nicht so, als gäbe es hier einen Mangel an Git-Fragen… Freut mich jedenfalls, dass ich helfen konnte.
– Dreier
1. September 2014 um 14:50 Uhr
Das von @TimurBernikovich erwähnte Github-Skript ist großartig und funktioniert für mich. Aber diese Github-URL hat sich geändert: docs.github.com/en/enterprise/2.17/user/github/using-git/…
– Kaiwen Sonne
13. Oktober 2020 um 4:14 Uhr