3131 Stimmen

Wie ändere ich den Namen des Autors und des Committers sowie die E-Mail von mehreren Commits in Git?

Ich schrieb ein einfaches Skript auf dem Schulcomputer und übertrug die Änderungen an Git (in einem Repo, das sich auf meinem USB-Stick befand und von meinem Computer zu Hause geklont wurde). Nach mehreren Übertragungen stellte ich fest, dass ich als Root-Benutzer etwas übertrug.

Gibt es eine Möglichkeit, den Autor dieser Übertragungen in meinen Namen zu ändern?

17 Stimmen

Frage: Bleiben bei der Verwendung von git filter-branch die SHA1-Werte für frühere Tags, Versionen und Objekte erhalten? Oder werden durch die Änderung des Autorennamens auch die zugehörigen SHA1-Sätze geändert?

0 Stimmen

Oder Sie können versuchen, mit refs/replace/ Mechanismus.

1 Stimmen

Nach der Neufassung, wenn sie ihre Arbeit nicht auf die Geschichte vor der Neufassung gestützt haben, nur git reset --hard origin/master oder einfach git pull origin (der vorspulen sollte). Wenn sie ihre Änderung als Grundlage nehmen, müssen sie eine neue Basis mit git rebase origin/master oder einfach git pull --rebase origin (die Befehle sind nur Beispiele).

71voto

asmeurer Punkte 79555

Ich möchte darauf hinweisen, dass es kein Problem ist, wenn das einzige Problem darin besteht, dass der Autor/die E-Mail anders ist als sonst. Die richtige Lösung besteht darin, eine Datei namens .mailmap am Fuß des Verzeichnisses mit Zeilen wie

Name you want <email you want> Name you don't want <email you don't want>

Und von da an werden Befehle wie git shortlog betrachtet diese beiden Namen als identisch (es sei denn, Sie weisen sie ausdrücklich darauf hin, dass dies nicht der Fall ist). Siehe https://schacon.github.io/git/git-shortlog.html für weitere Informationen.

Dies hat gegenüber allen anderen Lösungen den Vorteil, dass Sie den Verlauf nicht neu schreiben müssen, was bei einem Upstream zu Problemen führen kann und immer eine gute Möglichkeit ist, versehentlich Daten zu verlieren.

Natürlich, wenn Sie etwas als Sie selbst committed haben und es eigentlich jemand anderes sein sollte, und es Ihnen nichts ausmacht, die Geschichte zu diesem Zeitpunkt umzuschreiben, ist es wahrscheinlich eine gute Idee, den Commit-Autor zu ändern, um die Zuordnung zu gewährleisten (in diesem Fall verweise ich Sie auf meine andere Antwort aquí ).

0 Stimmen

Das ist wirklich eine sehr interessante Antwort. In meinem Fall habe ich einige Übertragungen von zu Hause aus vorgenommen, und es könnte einen zusätzlichen Autor verwirren, so dass dies alles ist, was ich brauchte.

2 Stimmen

Beachten Sie auch, dass dies nicht für die Web-Seite auf Gitea funktioniert.

0 Stimmen

@iuliu.net Ich bin mir nicht sicher. Diese Frage stackoverflow.com/questions/53629125/ scheint darauf hinzudeuten, aber ich habe es nicht bestätigt. Wenn sie es nicht tun, dann sollten sie es natürlich tun, denn es ist ein Standardbestandteil von Git.

55voto

brauliobo Punkte 5105

Sie können dies als alias damit Sie das tun können:

git change-commits GIT_AUTHOR_NAME "old name" "new name"

oder für die letzten 10 Übertragungen:

git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD

Zu ~/.gitconfig hinzufügen:

[alias]
    change-commits = "!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" $@; }; f "

Fuente: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

Ich hoffe, es ist nützlich.

6 Stimmen

"git: 'change-commits' ist kein Git-Befehl. Siehe 'git --help'."

0 Stimmen

Nach diesem Befehl und dem Sync mit dem Master sind alle Commits in der History dupliziert! Auch von anderen Benutzern :(

0 Stimmen

@Vladimir das wird erwartet, bitte lerne über die Änderung der Geschichte in Git

52voto

Saurabh P Bhandari Punkte 5104

Eine sicherere Alternative zu git's filter-branch es filter-repo Werkzeug, wie in den Git-Dokumenten vorgeschlagen aquí .

git filter-repo --commit-callback '
  old_email = b"your-old-email@example.com"
  correct_name = b"Your Correct Name"
  correct_email = b"your-correct-email@example.com"

  if commit.committer_email == old_email :
    commit.committer_name = correct_name
    commit.committer_email = correct_email

  if commit.author_email == old_email : 
    commit.author_name = correct_name
    commit.author_email = correct_email
  '

Der obige Befehl spiegelt die Logik wider, die in este Skript, sondern verwendet filter-repo anstelle von filter-branch .

Der Codeteil nach commit-callback ist im Grunde Python-Code, der für die Verarbeitung von Übertragungen verwendet wird. Sie können hier Ihre eigene Logik in Python schreiben. Siehe mehr über commit Objekt und seine Attribute aquí .

Seit filter-repo Tool nicht mit Git gebündelt ist, müssen Sie es separat installieren.

Ver Voraussetzungen y Installationsanleitung

Wenn Sie eine Python-Env >= 3.5 haben, können Sie pip um sie zu installieren.

pip3 install git-filter-repo

Hinweis : Es wird dringend empfohlen, zu versuchen filter-repo Werkzeug auf einem neuen Klon. Auch Fernbedienungen werden entfernt, sobald der Vorgang abgeschlossen ist. Lesen Sie mehr darüber, warum Fernbedienungen entfernt werden aquí . Lesen Sie auch die Einschränkungen dieses Tools unter INTERNES Abschnitt.

2 Stimmen

Dies scheint das neue Kind auf dem Block zu sein, und ich schätze diese Antwort wie Gold. Denken Sie daran, dass die Felder binär sein müssen und entfernen Sie dann die == Zeilen, und Sie können bedingungslos alles ändern, bevor Sie schieben. Habe ich schon gesagt, dass ich diese Antwort mag? Sie sollte die akzeptierte Antwort sein.

0 Stimmen

Vielen Dank für die Weitergabe der Links im Note Abschnitt.

0 Stimmen

Damit dies unter Windows funktioniert, musste ich alle doppelten Anführungszeichen entfernen: old_email = b\"your-old-email@example.com\"

52voto

stigkj Punkte 1409

Dies ist eine ausführlichere Version der Version von @Brian:

Um den Autor und Committer zu ändern, können Sie dies tun (mit Zeilenumbrüchen in der Zeichenkette, was in der Bash möglich ist):

git filter-branch --env-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
    then
        GIT_COMMITTER_NAME="<New name>";
        GIT_COMMITTER_EMAIL="<New email>";
        GIT_AUTHOR_NAME="<New name>";
        GIT_AUTHOR_EMAIL="<New email>";
    fi' -- --all

Möglicherweise erhalten Sie eine der folgenden Fehlermeldungen:

  1. Das temporäre Verzeichnis existiert bereits
  2. Refs beginnend mit refs/original existiert bereits
    (dies bedeutet, dass zuvor ein anderer Filterzweig auf das Repository angewendet wurde und der ursprüngliche Zweigverweis unter refs/original )

Wenn Sie den Lauf trotz dieser Fehler erzwingen wollen, fügen Sie die --force Flagge:

git filter-branch --force --env-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
    then
        GIT_COMMITTER_NAME="<New name>";
        GIT_COMMITTER_EMAIL="<New email>";
        GIT_AUTHOR_NAME="<New name>";
        GIT_AUTHOR_EMAIL="<New email>";
    fi' -- --all

Eine kleine Erklärung der -- --all Option erforderlich sein könnte: Sie bewirkt, dass der Filter-Zweig auf alle Revisionen auf alle Schiedsrichter (die alle Zweige umfasst). Das bedeutet zum Beispiel, dass auch Tags umgeschrieben werden und in den umgeschriebenen Zweigen sichtbar sind.

Ein häufiger "Fehler" ist die Verwendung von HEAD stattdessen, was bedeutet, dass alle Revisionen nur nach dem aktuelle Branche . Und dann würden im neu geschriebenen Zweig keine Tags (oder andere Verweise) existieren.

0 Stimmen

Großes Lob für die Bereitstellung einer Prozedur, die Commits auf todo refs/Abzweigungen.

49voto

Ryanmt Punkte 3137

Wenn Sie eine nicht gemeldete Übertragung von einem anderen Autor übernehmen, können Sie dies auf einfache Weise tun.

git commit --amend --reset-author

1 Stimmen

Für einen einzelnen Commit und wenn Sie Ihren Benutzernamen angeben möchten, ist dies der einfachste Weg.

7 Stimmen

Sie können hinzufügen --no-edit um dies noch einfacher zu machen, da die meisten Leute nur die E-Mail-Adresse und nicht die Übermittlungsnachricht aktualisieren wollen

0 Stimmen

Könnt ihr mir bitte den Git-Befehl mitteilen, mit dem ich die E-Mail/Benutzername der letzten Übertragung mit dem neuen aktualisieren kann?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X