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).

19voto

Sajib Khan Punkte 20152
  1. Commit ändern author name & email von Amend , dann ersetzt man old-commit with new-one :

    $ git checkout <commit-hash>                            # checkout to the commit need to modify  
    $ git commit --amend --author "name <author@email.com>" # change the author name and email
    
    $ git replace <old-commit-hash> <new-commit-hash>      # replace the old commit by new one
    $ git filter-branch -- --all                           # rewrite all futures commits based on the replacement                   
    
    $ git replace -d <old-commit-hash>     # remove the replacement for cleanliness 
    $ git push -f origin HEAD              # force push 
  2. Ein anderer Weg Rebasing :

    $ git rebase -i <good-commit-hash>      # back to last good commit
    
    # Editor would open, replace 'pick' with 'edit' before the commit want to change author
    
    $ git commit --amend --author="author name <author@email.com>"  # change the author name & email
    
    # Save changes and exit the editor
    
    $ git rebase --continue                # finish the rebase

2 Stimmen

Sehr schöne Antwort. Mir gefällt, dass die Änderungen von der Aktualisierung bis hin zum Aufräumen der Git-Commits eingepackt werden

9voto

Jakub Narębski Punkte 286531

Wenn Sie der einzige Benutzer dieses Repositorys sind, können Sie die Geschichte umschreiben entweder durch git filter-branch (als svick schrieb ), oder git fast-export / git fast-import plus Filterskript (wie im Artikel beschrieben, auf den in docgnome Antwort ), oder interaktiv neu gründen . Aber beide würden die Revisionen ab dem ersten geänderten Commit ändern; das bedeutet Ärger für jeden, der seine Änderungen auf Ihrem Zweig vor dem Rewrite basiert.

RECOVERY

Wenn andere Entwickler ihre Arbeit nicht auf die Vorabversion stützen, wäre die einfachste Lösung, erneut zu klonen (erneut zu klonen).

Alternativ dazu können sie versuchen git rebase --pull die vorspulen würden, wenn es keine Änderungen in ihrem Repository gäbe, oder ihren Zweig auf neu geschriebene Commits zurücksetzen würden (wir wollen Merge vermeiden, da es Pre-Rewrite-Commits für immer behalten würde). All dies unter der Annahme, dass sie noch keine Arbeit übertragen haben; verwenden Sie git stash um Änderungen anderweitig zu verstauen.

Wenn andere Entwickler Feature-Zweige verwenden, und/oder git pull --rebase nicht funktioniert, z. B. weil der Upstream nicht eingerichtet ist, müssen sie neu gründen ihre Arbeit zusätzlich zu den Post-Rewrite-Commits. Zum Beispiel direkt nach dem Holen neuer Änderungen ( git fetch ), für eine master Zweig basiert auf / gegabelt von origin/master muss man ausführen

$ git rebase --onto origin/master origin/master@{1} master

Hier origin/master@{1} ist der Zustand vor dem Umschreiben (vor dem Abrufen), siehe gitrevisions .


Eine alternative Lösung wäre die Verwendung von refs/replace/ Mechanismus, der in Git seit Version 1.6.5 verfügbar ist. Bei dieser Lösung stellen Sie Ersetzungen für Commits bereit, die eine falsche E-Mail haben; dann kann jeder, der die "replace"-Referenzen abruft (etwas wie fetch = +refs/replace/*:refs/replace/* refspec an geeigneter Stelle in ihre .git/config ) würden auf transparente Weise Ersetzungen erhalten, und diejenigen, die diese Referenzen nicht abrufen, würden alte Übertragungen sehen.

Das Verfahren läuft in etwa so ab:

  1. Alle Commits mit falscher E-Mail finden, zum Beispiel mit

    $ git log --author=user@wrong.email --all
  2. Erstellen Sie für jede falsche Übertragung eine Ersatzübertragung und fügen Sie sie der Objektdatenbank hinzu

    $ git cat-file -p <ID of wrong commit> | 
      sed -e 's/user@wrong\.email/user@example.com/g' > tmp.txt
    $ git hash-object -t commit -w tmp.txt
    <ID of corrected commit>
  3. Nun, da Sie den korrigierten Commit in der Objektdatenbank haben, müssen Sie Git anweisen, automatisch und transparent den falschen Commit durch den korrigierten zu ersetzen, indem Sie git replace Befehl:

    $ git replace <ID of wrong commit> <ID of corrected commit>
  4. Listen Sie abschließend alle Ersetzungen auf, um zu überprüfen, ob dieses Verfahren erfolgreich war

    $ git replace -l

    und prüfen, ob Ersetzungen stattfinden

    $ git log --author=user@wrong.email --all

Sie können diese Prozedur natürlich automatisieren... nun, alles außer der Verwendung von git replace die (noch) nicht über einen Batch-Modus verfügt, so dass Sie dafür eine Shell-Schleife verwenden oder "von Hand" ersetzen müssen.

NICHT GEPRÜFT! YMMV.

Beachten Sie, dass Sie bei der Verwendung der folgenden Funktionen auf einige raue Ecken stoßen könnten refs/replace/ Mechanismus: er ist neu und noch nicht sehr gut getestet .

8voto

mixalbl4 Punkte 2808

Zum Zurücksetzen ALLER Commits (einschließlich des ersten Commits) auf den aktuellen Benutzer und den aktuellen Zeitstempel:

git rebase --root --exec "git commit --amend --no-edit --date 'now' --reset-author"

0 Stimmen

Funktioniert dies nur für den aktuellen Zweig.

8voto

Sir Athos Punkte 8351

Beachten Sie, dass Git Folgendes speichert zwei verschiedene E-Mail-Adressen, eine für die Committer (die Person, die die Änderung vorgenommen hat) und eine weitere für die Autor (die Person, die die Änderung geschrieben hat).

Die Committer-Informationen werden an den meisten Stellen nicht angezeigt, aber Sie können sie mit git log -1 --format=%cn,%ce (oder verwenden Sie show anstelle von log um eine bestimmte Übergabe anzugeben).

Während das Ändern des Autors der letzten Übertragung so einfach ist wie git commit --amend --author "Author Name <email@example.com>" gibt es keinen Einzeiler oder ein Argument, um das Gleiche mit den Committer-Informationen zu tun.

Die Lösung besteht darin, dass Sie (vorübergehend oder nicht) Ihre Benutzerdaten ändern und dann den Commit abändern, wodurch der Committer auf Ihre aktuellen Daten aktualisiert wird:

git config user.email my_other_email@example.com 
git commit --amend

0 Stimmen

Beachten Sie, dass der alte Wert noch an einigen Stellen in path\to\repo\.git . Ich bin mir noch nicht sicher, was Sie tun müssen, um es vollständig zu löschen. Berichtigungen scheinen leider (?) nicht zu tilgen.

6voto

djromero Punkte 19411

Wenn es sich bei den Commits, die Sie korrigieren möchten, um die neuesten handelt und nur ein paar davon, können Sie eine Kombination aus git reset y git stash zurückzugehen und sie erneut zu übertragen, nachdem Sie den richtigen Namen und die richtige E-Mail konfiguriert haben.

Die Sequenz wird in etwa so aussehen (bei 2 falschen Übertragungen, keine ausstehenden Änderungen):

git config user.name <good name>
git config user.email <good email>
git reset HEAD^
git stash
git reset HEAD^
git commit -a
git stash pop
git commit -a

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