Wie ändere ich den Autor eines Commits für die letzten paar Commits in Github richtig?

Lesezeit: 8 Minuten

Benutzer-Avatar
BieneFriedmann

In den letzten Tagen habe ich einen anderen Laptop verwendet, ich habe Git eingerichtet und mich angemeldet, aber ich habe versehentlich meinen Benutzernamen mit einer falschen E-Mail verwendet.

Heute ist mir aufgefallen, dass meine Commits der letzten Tage nicht auf meinem Github-Profil-Dashboard angezeigt wurden, also habe ich nachgesehen, was los ist, und festgestellt, dass ich die falsche E-Mail-Adresse für die Anmeldung verwendet habe.

Ich habe verschiedene Möglichkeiten ausprobiert, um das Problem zu beheben, aber keine davon hat funktioniert.

1.

git rebase -i -p <The last commit with the good email>

Dann für jeden Commit.

git commit --amend --author="good name <good email>" --no-edit
git rebase --continue

Anstatt nur den Autor der Commits zu ändern, wurden neue Commits mit meiner guten E-Mail erstellt, aber die alten nicht geändert.

2.

git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
     GIT_AUTHOR_EMAIL=correct@email;
     GIT_AUTHOR_NAME="Correct Name";
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
     GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all

wie hier zu sehen, aber es hat nichts gebracht …

3.
In einer der Antworten erwähnte jemand, dass ich denselben Befehl verwenden sollte wie ich.

git rebase -i -p <The last commit with the good email>

aber ohne das “-p”. Ich habe es versucht, aber es hat auch neue Commits gemacht und die alten Commits mit den alten Daten nicht beibehalten.


Also brauche ich Hilfe, um alle neuen Commits meines Verlaufs zu bekommen und die alten zu reparieren, um die gute E-Mail zu haben.

  • Diese Frage wurde auf Meta erwähnt.

    – Yiv

    15. Juli 2021 um 7:16 Uhr

  • Okay, Sie haben uns keine Fehlermeldungen gegeben, die Sie erhalten, aber: Stellen Sie sicher, dass Sie Ihre neuen Commits nicht entfernt haben 🙂 Wie bereits in der von Ihnen bereits erwähnten Antwort gepostet und auch unten, wenn Sie alles lokal behoben haben, Sie müssen es richtig auf den Server bringen, und das wäre, indem Sie es mit dem machen forced Flag: “git push –force”

    – Janos Vinceller

    18. Juli 2021 um 17:43 Uhr

  • @JanosVinceller Ich habe keine Fehler bekommen. Es hat nur den Autor überhaupt nicht geändert.

    – BieneFriedmann

    18. Juli 2021 um 20:15 Uhr

  • @BeeFriedman OK: würde git filter-repo arbeite besser?

    – VonC

    18. Juli 2021 um 20:17 Uhr

  • COMMITS KÖNNEN NICHT GEÄNDERT WERDEN. Sie können neue erstellen und Etiketten neu aufhängen, sodass die Etiketten auf sie statt auf die Originale verweisen, aber COMMITS KÖNNEN NICHT GEÄNDERT WERDEN.

    – jthill

    20. Juli 2021 um 19:42 Uhr

Vielen Dank an alle, die mitgeholfen haben! Am Ende habe ich viele verschiedene Ansätze bekommen, aber es hat bei mir nicht geklappt. Am Ende musste ich mein Repo mehrmals auf den Zustand vor den Änderungen zurücksetzen, weil die Dinge durcheinander geraten sind.
Am Ende habe ich mich an den Github-Support gewandt, und das haben sie mir gesagt, und es hat funktioniert. Ich poste es hier in der Hoffnung, dass es jemandem helfen würde, der ein ähnliches Problem hat.

PS Dies ist dieser hier vorgeschlagenen Antwort ziemlich ähnlich, aber diese Antwort hat nicht funktioniert, als ich es versuchte. Dieser hat einige geringfügige Änderungen (Klonen einer bloßen Kopie und Durchführen der Änderung dort) und es hat funktioniert.


1 – Bevor Sie dieses Skript ausführen, benötigen Sie:

Die alte E-Mail-Adresse, die in den Autoren-/Committer-Feldern erscheint, die Sie ändern möchten. Den korrekten Namen und die E-Mail-Adresse, denen solche Commits zugeordnet werden sollen. 2 – Erstellen Sie einen neuen, bloßen Klon Ihres Repositorys:

  git clone --bare <external repo URL>.git
  cd <reponame>.git

3 – Kopieren Sie das Skript und fügen Sie es ein, wobei Sie die folgenden Variablen basierend auf den gesammelten Informationen ersetzen:

OLD_EMAIL
CORRECT_NAME
CORRECT_EMAIL
  #!/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

4 – Drücken Sie die Eingabetaste, um das Skript auszuführen.

5 – Überprüfen Sie den neuen Git-Verlauf auf Fehler.

6 – Pushen Sie den korrigierten Verlauf an:

  git push --mirror <GitHub repo URL>.git

7 – Bereinigen Sie den temporären Klon:

  cd ..
  rm -rf <reponame>.git

Benutzer-Avatar
VonC

Versuchen Sie es zuerst und klonen Sie das Repository in a getrennt lokalen Ordner, um den folgenden Befehl zu testen.

Sie müssen installieren newren/git-filter-repo um den Autor von Ihrem alten Konto auf Ihr neues Konto umzuschreiben.

Siehe „Wie ändere ich den Commit-Autor für mehrere Commits mithilfe des Filterzweigs?“ und
git filter-repo / Benutzer- und E-Mail-basierte Filterung

git filter-repo --mailmap my-mailmap

mit my-mailmap:

Correct Name <[email protected]> <[email protected]>

Dadurch werden Ihre Commits mit dem richtigen Autor neu geschrieben.

Sie müssen dann git push --force (vorausgesetzt eins main Branch), um den Remote-Verlauf mit Ihren neuen Commits zu überschreiben. Wenn Sie nicht alleine am Remote-Repository arbeiten, teilen Sie dies Ihren Mitarbeitern mit.

  • In Ihrer Antwort schlagen Sie vor, ein Tool eines Drittanbieters zu verwenden. Gibt es keine Möglichkeit, dies nur mit Git zu tun?

    – BieneFriedmann

    19. Juli 2021 um 2:50 Uhr

  • @BeeFriedman Aus Gründen, die in beschrieben sind, nicht zuverlässig github.com/newren/…. Versuche es. es funktioniert wirklich gut.

    – VonC

    19. Juli 2021 um 5:52 Uhr

  • Lesen Sie die letzte Zeile des ersten Absatzes unter VonCs Link 😉

    – Inigo

    19. Juli 2021 um 7:07 Uhr

  • @VonC, ich habe versucht, dieses Tool zu verwenden, und ich habe einige Probleme. Die einzige Möglichkeit, es auszuführen, ist als Python-Skript “git filter-repo.py”, und wenn ich die Flags hinzufüge und es ausführe, passiert nichts. Könnten Sie bitte näher erläutern, wie Sie es unter Windows verwenden. Vielen Dank!

    – BieneFriedmann

    20. Juli 2021 um 15:34 Uhr


  • @BeeFriedman Ich habe es unter Windows getestet (in einer einfachen CMD) ohne Problem: git filter-repo (nein .py Erweiterung) reicht aus, vorausgesetzt, Python und das Skript (d. h. ein Klon von github.com/newren/git-filter-repo) befinden sich in Ihrem %PATH%.

    – VonC

    20. Juli 2021 um 15:55 Uhr


Benutzer-Avatar
Anubhav Gupta

Sie waren der richtigen Methode sehr nahe. Nur nicht hinzufügen -p beim Umbasieren.

Laut Git-Dokumentation,
https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt—preserve-merges

-p Option – Merge-Commits neu erstellen, anstatt den Verlauf zu glätten, indem Commits wiederholt werden, die ein Merge-Commit einführt.

Ich habe die gleichen Schritte ausgeführt, die Sie in Ihrer Frage erwähnt haben, ohne -p, und es funktionierte einwandfrei. Hier ist die Liste der Schritte, falls Sie es brauchen.


Klonen Sie zunächst das Repo lokal und führen Sie eine interaktive Rebase für alle Commits durch.

git rebase --interactive COMMIT~

Zum Beispiel :-

git rebase --interactive 8020fc5fe36d75b066f7c06a29c92a29ccf6e2b4~

wo 8020fc5fe36d75b066f7c06a29c92a29ccf6e2b4 ist der älteste Commit, ab dem Sie mit der Reparatur beginnen möchten.

Sie können diesen Wert von erhalten git log

Nach dem Rennen git rebasehaben Sie einen Texteditor mit Optionen zu pick/edit/… für jeden Commit.

Nehmen wir ein Beispiel, wo Sie so etwas bekommen …

pick 8020fc5 1
pick e99c3c7 2
pick 7c4f81e 3
pick 3b30037 4
pick 98d901b 5
pick 8ded5a1 6
pick 5a61adc 7
pick 8fe082c 8
pick 1abebc1 9

Ändern Sie für alle Commits, für die Sie den Autor ändern möchten, den Befehl in edit aus pick

Wie im folgenden Beispiel möchte ich die Autoren für ändern 3 und 5so

pick 8020fc5 1
pick e99c3c7 2
edit 7c4f81e 3 #changed here
pick 3b30037 4
edit 98d901b 5 #changed here
pick 8ded5a1 6
pick 5a61adc 7
pick 8fe082c 8
pick 1abebc1 9

Speichern Sie nun die Datei und beenden Sie sie.

Dann befinden Sie sich an dem Punkt, kurz bevor Sie das erste Commit anwenden, auf das Sie sich festgelegt haben edit.

Führen Sie die folgenden Schritte aus, ohne etwas zu ändern.

git commit --amend --author="NAME <EMAIL>" --no-edit
git rebase --continue

Danach befindet sich das Repository an dem Punkt kurz vor dem Anwenden des zweiten von Ihnen ausgewählten Commits editalso wiederholen Sie es, bis Sie fertig sind

Aktualisieren:

git rebase --committer-date-is-author-date HASH wobei HASH der erste Commit mit dem richtigen Zeitstempel ist.

Dann mach git log --format=fuller um zu sehen, ob die Commit-Zeitstempel Ihren Wünschen entsprechen.

  • Ich bin Ihrer Antwort gefolgt, und sie hat alles mit dem heutigen Datum festgelegt. Ich möchte, dass sie die ursprünglichen Daten haben. Wie könnte ich das rückgängig machen und beheben.

    – BieneFriedmann

    20. Juli 2021 um 15:32 Uhr

  • Es tut mir leid, ich hatte die falsche Vorstellung, dass github das Datum des Autors und nicht das Datum des Commiters anzeigt. Es kann leicht behoben werden, und ich habe meine Antwort aktualisiert. Hoffentlich behebt es Ihr Problem. Könnten Sie jedoch ein Git-Protokoll erstellen und bitte bestätigen, ob die Zeitstempel, die Sie im Git-Protokoll sehen, die sind, die Sie auf Github sehen möchten? Wenn dies der Fall ist, folgen Sie der aktualisierten Antwort.

    – Anubhav Gupta

    21. Juli 2021 um 0:59 Uhr

  • Ja, im Log haben sie die richtigen Daten. Ich werde Ihre aktualisierte Antwort versuchen. Vielen Dank!

    – BieneFriedmann

    21. Juli 2021 um 1:01 Uhr

  • Warte, ich aktualisiere es noch.

    – Anubhav Gupta

    21. Juli 2021 um 1:02 Uhr

  • Ich habe alles hinzugefügt, was ich hinzufügen musste, git rebase --committer-date-is-author-date HASH wobei HASH der erste Commit mit dem richtigen Zeitstempel ist.

    – Anubhav Gupta

    21. Juli 2021 um 1:07 Uhr

1012000cookie-checkWie ändere ich den Autor eines Commits für die letzten paar Commits in Github richtig?

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

Privacy policy