Wie ändere ich den Autor für eine Reihe von Commits?
Wie ändere ich den Namen/die E-Mail-Adresse des Autors und des Committers für mehrere Commits?
Flavio Amieiro
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 Umschreiben des gesamten Verlaufs erfordern. Wenn Sie damit einverstanden sind und denken, dass es sich lohnt, sollten Sie es überprüfen git filter-branch. Die Handbuchseite 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-Handbuchseite.
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="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
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 <[email protected]> Commit Name <[email protected]>
Führen Sie dann filter-repo mit der erstellten Mailmap aus:
git filter-repo --mailmap git-mailmap
-
Nach dem Ausführen des Skripts können Sie den Sicherungszweig entfernen, indem Sie “git update-ref -d refs/original/refs/heads/master” ausführen.
– DR
14. August 2013 um 16:47 Uhr
-
@rodowi, es dupliziert alle meine Commits.
– Raffael Barros
17. Juni 2014 um 17:43 Uhr
-
@RafaelBarros Die Autoreninformationen (wie alles andere in der Geschichte) sind Teil des sha-Schlüssels des Commits. Jede Änderung des Verlaufs ist ein Neuschreiben, das zu neuen IDs für alle Commits führt. Schreiben Sie also nicht auf ein gemeinsames Repo um oder stellen Sie sicher, dass alle Benutzer sich dessen bewusst sind …
– Johannes
11. Juni 2015 um 13:52 Uhr
-
Gelöst mit
git push --force --tags origin HEAD:master
– mfort
13. November 2016 um 11:50 Uhr
-
WICHTIG!!! Bevor Sie das Skript ausführen, stellen Sie die Git-Konfigurationsparameter user.name und user.email richtig ein! Und nachdem Sie das Skript ausgeführt haben, haben Sie einen doppelten Backup-Verlauf namens “Original”! Löschen Sie es über
git update-ref -d refs/original/refs/heads/master
und dann prüfen ob.git/refs/original
Ordnerstruktur ist leer und dann einfach mit entfernenrm -rf .git/refs/original
. Schließlich können Sie das neu geschriebene Protokoll überprüfen über:git log --pretty=format:"[%h] %cd - Committer: %cn (%ce), Author: %an (%ae)"
! Eine Sache noch:.git/logs
hat einige Protokolldateien, die noch Ihren alten Namen haben!– gw0
3. Februar 2017 um 22:23 Uhr
-
Warum werden alle Commits neu geschrieben, wenn Sie angeben
HEAD
am Ende des Befehls?– Nick Wolynkin
18. Juni 2015 um 3:26 Uhr
-
Dies funktioniert nicht für mein Bitbucket-Repository, irgendeine Idee? Ich mache ein
git push --force --tags origin 'refs/heads/*'
nach dem empfohlenen Befehl– Olorin
5. Oktober 2016 um 21:46 Uhr
-
Der Push-Befehl dafür lautet:
$git push --force --tags origin 'refs/heads/master'
– HARSH NILESH PATHAK
8. Juni 2018 um 22:07 Uhr
-
Sauber; dies behält auch die alten Zeitstempel.
– DharmaTurtle
6. März 2020 um 21:19 Uhr
-
@HARSHNILESHPATHAK Beachten Sie, dass für kürzlich erstellte Repositories der Branch-Master in main umbenannt wurde, sodass der Befehl zu main wird
$git push --force --tags origin 'refs/heads/main'
– Alex Gisi
20. Januar 2021 um 22:30 Uhr
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 von '
:
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
-
Ist die Verwendung von env-filter nicht die einfachere Lösung? Ich bin mir nicht sicher, warum dies dann mehr Stimmen bekommt.
– stigkj
9. Dezember 2011 um 9:21 Uhr
-
Dann ist der Link kaputt. Wie übertragen wir diese Änderungen auf ein anderes Repository?
– Russel
18. Februar 2012 um 23:21 Uhr
-
env-filter ändert alle Commits. Diese Lösung erlaubt eine Bedingung.
– Benutzer208769
11. April 2012 um 15:29 Uhr
-
"A previous backup already exists in refs/original/ Force overwriting the backup with -f"
sorry aber wo die-f
-flag wird sein, wenn dieses Skript zweimal ausgeführt wird. Eigentlich steht das in Brians Antwort, Entschuldigung für die Störung, kurz nachdem der Filterzweig die Lösung ist.– hhh
4. Mai 2012 um 22:11 Uhr
-
@ user208769 env-filter erlaubt auch eine Bedingung; schau dir meine antwort an 🙂
– stigkj
11. April 2013 um 8:52 Uhr
Stephan Ostermüller
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 [email protected]
git commit --amend --reset-author
Getestet mit Git-Version 1.7.5.4.
Beachten Sie, dass dies nur den letzten Commit behebt.
-
Ist die Verwendung von env-filter nicht die einfachere Lösung? Ich bin mir nicht sicher, warum dies dann mehr Stimmen bekommt.
– stigkj
9. Dezember 2011 um 9:21 Uhr
-
Dann ist der Link kaputt. Wie übertragen wir diese Änderungen auf ein anderes Repository?
– Russel
18. Februar 2012 um 23:21 Uhr
-
env-filter ändert alle Commits. Diese Lösung erlaubt eine Bedingung.
– Benutzer208769
11. April 2012 um 15:29 Uhr
-
"A previous backup already exists in refs/original/ Force overwriting the backup with -f"
sorry aber wo die-f
-flag wird sein, wenn dieses Skript zweimal ausgeführt wird. Eigentlich steht das in Brians Antwort, Entschuldigung für die Störung, kurz nachdem der Filterzweig die Lösung ist.– hhh
4. Mai 2012 um 22:11 Uhr
-
@ user208769 env-filter erlaubt auch eine Bedingung; schau dir meine antwort an 🙂
– stigkj
11. April 2013 um 8:52 Uhr
Stephan Ostermüller
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 protected]>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <[email protected]>" -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.
-
Definitiv toll. Können Sie es verkürzen, indem Sie user.name und user.email in der lokalen Konfiguration des Repos festlegen, und dann ist jede Zeile nur
exec git commit --amend --reset-author -C HEAD
?– Andreas
30. November 2012 um 11:07 Uhr
-
Die kanonische Antwort, um den Filterzweig zu verwenden, hat nur refs/heads/master für mich gelöscht. Also +1 zu Ihrer steuerbaren, editierbaren Lösung. Vielen Dank!
– jmtd
17. Juni 2014 um 20:30 Uhr
-
Anstelle von
git rebase -i HEAD^^^^^^
du kannst auch schreibengit rebase -i HEAD~6
– Patrick Schlüter
9. Juni 2015 um 13:09 Uhr
-
Bitte beachten Sie, dass sich dadurch der Zeitstempel der Commits ändert. Siehe stackoverflow.com/a/11179245/1353267 zum Zurücksetzen auf die korrekten Zeitstempel
– Samveen
10. Oktober 2017 um 11:50 Uhr
-
Für alle anderen, die mit dem gleichen Problem wie ich zu kämpfen haben, wenn Sie versuchen, das anfängliche Commit einzuschließen, und Sie erhalten
fatal: Needed a single revision
Versuchengit rebase -i --root
stattdessen– DJMcMayhem
23. November 2020 um 18:44 Uhr
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