Wie ändere ich den Namen/die E-Mail-Adresse des Autors und des Committers für mehrere Commits?

Lesezeit: 8 Minuten

Benutzer-Avatar
Flavio Amieiro

Wie ändere ich den Autor für eine Reihe von Commits?

  • 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


Benutzer-Avatar
Pat Notz

Diese Antwort verwendet git-filter-branchwofü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 entfernen rm -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


Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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 nurexec 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 schreiben git 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 revisionVersuchen git rebase -i --root stattdessen

    – DJMcMayhem

    23. November 2020 um 18:44 Uhr

1330670cookie-checkWie ändere ich den Namen/die E-Mail-Adresse des Autors und des Committers für mehrere Commits?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy