Frage Wie ändere ich den Namen und die E-Mail-Adresse des Autors und des Commiters für mehrere Commits in Git?


Ich schrieb ein einfaches Skript in den Schulcomputer und übergab die Änderungen an Git (in einem Repo, das in meinem Pendrive war, geklont von meinem Computer zu Hause). Nach mehreren Commits merkte ich, dass ich als root-Benutzer etwas vermittelte.

Gibt es eine Möglichkeit, den Autor dieser Commits auf meinen Namen zu ändern?


1998
2018-04-15 03:09


Ursprung


Antworten:


Wenn Sie den Autor (oder den Committer) ändern möchten, müssen Sie den gesamten Verlauf neu schreiben. Wenn Sie damit einverstanden sind und denken, dass es das wert ist, dann sollten Sie es sich anschauen Git Filter-Zweig. 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 Committers, der Daten usw. zu ändern - siehe den Abschnitt "Umgebungsvariablen" des Git Man Seite.

Insbesondere können Sie alle falschen Autorennamen und E-Mails korrigieren für alle Zweige 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

800
2018-04-15 03:16



Interaktive Rebase verwenden

Du könntest es tun

git rebase -i -p <some HEAD before all of your bad commits>

Markieren Sie dann alle Ihre Bad Commits als "Bearbeiten" in der Rebase-Datei. Wenn Sie auch das erste Commit ändern möchten, müssen Sie es manuell als erste Zeile in der Rebasedatei hinzufügen (folgen Sie dem Format der anderen Zeilen). Dann, wenn Git Sie bittet, jedes Commit zu ändern, tun Sie es

 git commit --amend --author "New Author Name <email@address.com>" 

Bearbeiten oder schließen Sie einfach den Editor, der geöffnet wird, und dann tun

git rebase --continue

um die Rebase fortzusetzen.

Sie könnten das Öffnen des Editors hier durch Anhängen überspringen --no-edit so dass der Befehl sein wird:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

Einfaches Commit

Wie einige der Kommentatoren angemerkt haben, ist der Rebase-Befehl nicht notwendig, wenn Sie nur den letzten Commit ändern möchten. Mach einfach

 git commit --amend --author "New Author Name <email@address.com>"

Dadurch wird der Autor zu dem angegebenen Namen geändert, aber der Committer wird auf den konfigurierten Benutzer in festgelegt git config user.name und git config user.email. Wenn Sie den Committer auf etwas festlegen möchten, das Sie angeben, werden sowohl der Autor als auch der Committer festgelegt:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

Hinweis zu Merge Commits

Es gab einen leichten Fehler in meiner ursprünglichen Antwort. Wenn es Zusammenführungs-Commits zwischen dem aktuellen gibt HEAD und dein <some HEAD before all your bad commits>, dann git rebase wird sie abflachen (und übrigens, wenn Sie GitHub Pull Requests verwenden, wird es eine Menge Merge Commits in Ihrem Verlauf geben). Dies kann sehr oft zu einer sehr unterschiedlichen Historie führen (da doppelte Änderungen "rebasiert" werden können), und im schlimmsten Fall kann es dazu führen, dass git rebase Sie werden gebeten, schwierige Zusammenführungskonflikte zu lösen (die wahrscheinlich bereits in den Zusammenführungs-Commits gelöst wurden). Die Lösung ist die Verwendung der -p Flagge zu git rebase, wodurch die Zusammenführungsstruktur Ihrer Geschichte erhalten bleibt. Die Manpage für git rebase warnt, dass mit -p und -i kann zu Problemen führen, aber in der BUGS Abschnitt heißt es "Bearbeiten von Commits und Neuformatierung ihrer Commit-Nachrichten sollte gut funktionieren."

Ich habe hinzugefügt -p zu dem obigen Befehl. Für den Fall, dass Sie nur das letzte Commit ändern, ist dies kein Problem.


1415
2017-08-24 03:08



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, dann 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

565
2018-05-15 19:15



Ein Liner, aber sei vorsichtig, wenn du ein Multi-User-Repository hast - das wird sich ändern alle verpflichtet sich, denselben (neuen) Autor und Committer zu haben.

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD

Mit Zeilenumbrüchen im String (was in bash möglich ist):

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='new@email'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='new@email'
  " HEAD

481
2018-04-15 03:22



Es passiert, wenn Sie kein $ HOME / .gitconfig initialisiert haben. 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


201
2018-02-16 09:46



Für einen einzelnen Commit:

git commit --amend --author="Author Name <email@address.com>"

(Auszug aus der Antwort des Asmeurs)


179
2018-04-26 22:50



In dem Fall, wo nur die ersten paar Commits schlechte Autoren haben, können Sie dies alles drinnen tun git rebase -i Verwendung der exec Befehl und die --amend begehen, wie folgt:

git rebase -i HEAD~6 # as required

Hier finden Sie die bearbeitbare Liste der Commits:

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

Speichern und Beenden des Editors (zum Ausführen).

Diese Lösung kann länger sein als andere, aber sie ist sehr gut kontrollierbar - ich weiß genau, was sie bewirkt.

Danke an @asmeurer für die Inspiration.


150
2017-12-08 17:05



Github hat eine nette LösungDies ist das folgende Shell-Skript:

#!/bin/sh

git filter-branch --env-filter '

an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"

if [ "$GIT_COMMITTER_EMAIL" = "your@email.to.match" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ]
then
    an="Your New Author Name"
    am="Your New Author Email"
fi

export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'

107
2017-10-07 09:54



Wie bereits erwähnt, ist das Umschreiben von Historien gefährlich und wird die Repositories anderer Leute beschädigen.

Aber wenn du das wirklich willst und du in einer bash-Umgebung bist (kein Problem unter Linux, unter Windows kannst du git bash verwenden, das bei der Installation von git mitgeliefert wird), benutze Git Filter-Zweig:

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL'

Um die Dinge zu beschleunigen, können Sie eine Reihe von Revisionen angeben, die Sie neu schreiben möchten:

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL' HEAD~20..HEAD

78
2017-08-04 00:52