Wie kann man den Autor eines Commits für ein bestimmtes Commit ändern?
Ich möchte den Autor eines bestimmten Commits in der Geschichte ändern. Dies ist nicht das letzte Commit.
Ich weiß von dieser Frage - wie kann ich den Autor eines Commits in git ändern?
Aber ich denke über etwas nach, bei dem ich ein Commit durch Hash oder Short Hash identifiziere.
Interaktive Erneuerung ab einem früheren Punkt in der Historie als das zu git rebase -i <earliercommit>
Commit ( git rebase -i <earliercommit>
). Ändern Sie in der Liste der Commits, die verschoben wurden, den Text von pick
zum edit
neben dem Hash des zu edit
Commits. Wenn Sie von git aufgefordert werden, das Commit zu ändern, verwenden Sie Folgendes:
git commit --amend --author="Author Name <email@address.com>"
Wenn Ihre ABCDE-f
Commit-Historie mit F
HEAD
ist und Sie den Autor von C
und D
ändern möchten, würden Sie ...
-
git rebase -i B
( hier sehen Sie ein Beispiel dafür, was Sie nach dem Ausführen desgit rebase -i B
)- Wenn Sie
A
bearbeiten müssen, verwenden Siegit rebase -i --root
- Wenn Sie
- Ändern Sie die Zeilen für
C
undD
vonpick
zumedit
- Sobald die Rebase beginnt, stoppt er zuerst bei
C
- Sie müssen
git commit --amend --author="Author Name <email@address.com>"
tungit commit --amend --author="Author Name <email@address.com>"
- Dann
git rebase --continue
- Dies wird wieder bei
D
- Dann müssen Sie erneut
git commit --amend --author="Author Name <email@address.com>"
-
git rebase --continue
- Der Umzug wird abgeschlossen.
- Verwenden Sie
git push -f
, um Ihre Quelle mit aktualisierten Commits zu aktualisieren.
Die akzeptierte Antwort auf diese Frage ist die überraschend clevere Anwendung der interaktiven Umsiedlung, die jedoch zu Konflikten führt, wenn der Autor, den wir ändern möchten, vom Autor für den später zusammengeführten Zweig verwendet wird. Im allgemeinen Fall funktioniert dies nicht bei der Verarbeitung von Dirty Stories.
Da ich Angst habe, Skripts auszuführen, die davon abhängig sind, dass Umgebungsvariablen gesetzt und zurückgesetzt werden, um die git-Historie zu überschreiben, schreibe ich eine neue Antwort, die auf diesem Beitrag basiert. Diese Antwort ähnelt dieser Antwort, ist jedoch vollständiger.
Folgendes wird getestet und funktioniert im Gegensatz zur zugehörigen Antwort. Nehmen wir zur Klarheit an, dass 03f482d6
ein Commit ist, dessen Autor wir zu ersetzen versuchen, und 42627abe
ein Commit mit einem neuen Autor ist.

Machen Sie ein Commit, das wir zu ändern versuchen.
git checkout 03f482d6
Ändern Sie den Autor.
git commit --amend --author "New Author Name <New Author Email>"
Jetzt haben wir ein neues Commit mit einem Hash von
42627abe
.Überprüfen Sie den ursprünglichen Zweig.
Ersetzen Sie das alte Commit lokal durch ein neues.
git replace 03f482d6 42627abe
Alle zukünftigen Commits basierend auf Ersetzung neu schreiben.
git filter-branch -- --all
Entfernen Sie den Reiniger.
git replace -d 03f482d6
Klicken Sie auf den neuen Verlauf (verwenden Sie nur --force, wenn Folgendes fehlschlägt, und nachdem die Funktionalität mit
git log
und / odergit diff
getestet wurde).git push --force-with-lease
Anstelle von 4-6 können Sie einfach zum neuen Commit wechseln:
git rebase -i 42627abe
Die Github-Dokumentation enthält ein Skript, das die Committer-Informationen für alle Commits in einem Zweig ersetzt .
150
Setzen Sie Ihre E-Mail-Adresse in der Konfiguration zurück:
git config --global user.email example@email.com
Setzen Sie den Autor Ihres Commits jetzt zurück, ohne ihn zu bearbeiten:
git commit --amend --reset-author --no-edit
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 Autorennamen ändern möchten, ist dies etwas schwierig. Sie müssen eine interaktive Neuinstallation starten, Commits als korrekt markieren, sie dann einzeln ändern und beenden.
Starten Sie den Neustart mit git rebase -i
. Er wird dir so etwas zeigen.
Ändern Sie das Auswahlschlüsselwort zur edit
für die Commits, die Sie den Namen des Autors ändern möchten.
Schließen Sie dann den Editor. Für :wq
drücken Enter
Escape
:wq
und geben dann :wq
und drücken Sie die Enter
.
Dann sehen Sie Ihr Terminal, als ob nichts passiert wäre. Sie befinden sich tatsächlich mitten in einer interaktiven Permutation. Nun ist es Zeit, den Namen des Autors mit dem obigen Befehl zu ändern. Er wird den Editor erneut öffnen. Schließen Sie den Neustart mit git rebase --continue
. Wiederholen Sie dasselbe für die Menge an Fix, die Sie bearbeiten möchten. Können Sie sicherstellen, dass die interaktive Zusammenfassung beendet ist, als Sie die Meldung No rebase in progress?
.
Antworten auf die Frage, mit der Sie verbunden sind, sind gute Antworten und decken Ihre Situation ab (eine andere Frage ist allgemeiner Art, da mehrere Commits neu geschrieben werden).
Als Vorwand für das Abfragen von git filter-branch
ich ein Skript geschrieben, um den Namen des Autors und / oder die E-Mail-Adresse des Autors für dieses Commit neu zu schreiben:
47
Beim Ausführen von git rebase -i
gibt es dieses interessante Bit im Dokument:
Wenn Sie zwei oder mehr Commits auf einen Commit zurücksetzen möchten, ersetzen Sie den Befehl
"pick"
durch einen zweiten und nachfolgenden Commit durch"squash"
oder"fixup"
. Wenn die Commits unterschiedliche Autoren hatten, wird der gefaltete Fixer dem Autor des ersten Commits zugeordnet. Die vorgeschlagene Festschreibungsnachricht für ein gefaltetes Festschreiben ist eine Verkettung der"fixup"
des ersten"fixup"
und der Befehle mit dem"squash"
Befehl, lässt jedoch die"fixup"
mit dem"fixup"
.
- Wenn Sie eine Geschichte
ABCDEF
, - und Sie möchten die Commits
B
undD
ändern (= 2 Commits),
dann kannst du tun:
-
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 zum Weiterleiten
-
git commit --allow-empty -m "empty"
- Starten Sie den Neustart
-
git rebase -i B^
-
B^
wählt das übergeordnete ElementB
-
- Sie müssen zuvor ein leeres Commit eingeben, damit jedes Commit geändert wird
- Sie müssen die
pick
ändern,pick
zusquash
.
Ein Beispiel dafür, was git rebase -i B^
Ihnen geben wird:
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
Ändern Sie es in:
# change commit B 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 author pick sha-commit-empty2 empty squash sha-commit-D some message # leave commit EF alone pick sha-commit-E some message pick sha-commit-F some message
Er wird Sie bitten, die Nachrichten zu bearbeiten:
# This is a combination of 2 commits. # The first commit message is: empty # This is the 2nd commit message: ...some useful commit message there...
und Sie können nur die ersten Zeilen löschen.
Wenn Sie ein zentrales Repository verwenden, müssen Sie die Amber-Antwort um einen weiteren Schritt erweitern:
git push -f
, um die Aktualisierung eines zentralen Repositorys zu erzwingen.
Achten Sie darauf, nicht viele Leute in einer Branche zu haben, da dies zu einem Konsistenzverlust führen kann.
Fix vor:
Weitere Fragen zu git git-commit- Tags oder Frage stellen