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

29voto

sporsh Punkte 347
  1. laufen. git rebase -i <sha1 or ref of starting point>

  2. Markieren Sie alle Commits, die Sie ändern möchten, mit edit (oder e )

  3. Führen Sie die beiden folgenden Befehle in einer Schleife aus, bis Sie alle Übertragungen verarbeitet haben:

    git commit --amend --reuse-message=HEAD --author="New Author <new@author.email>" ; git rebase --continue

Dadurch werden alle anderen Übermittlungsinformationen (einschließlich der Daten) beibehalten. Die --reuse-message=HEAD verhindert, dass der Nachrichteneditor gestartet wird.

0 Stimmen

Dadurch wird der Committer nicht aktualisiert. Wenn Sie den Autor und den Committer aktualisieren und dabei die Daten beibehalten wollen, sind Sie vielleicht interessiert an meine Antwort

28voto

Ton van den Heuvel Punkte 9567

Ich verwende das Folgende, um den Autor für ein gesamtes Repository, einschließlich Tags und aller Zweige, neu zu schreiben:

git filter-branch --tag-name-filter cat --env-filter "
  export GIT_AUTHOR_NAME='New name';
  export GIT_AUTHOR_EMAIL='New email'
" -- --all

Dann, wie im Abschnitt MAN-Seite von filter-branch entfernen Sie alle Originalreferenzen, die durch filter-branch (dies ist zerstörerisch, vorher sichern):

git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d

3 Stimmen

Es ist sehr wichtig, die --tag-name-filter cat . Andernfalls verbleiben Ihre Tags in der ursprünglichen Kette von Commits. In den anderen Antworten wird dies nicht erwähnt.

21voto

Leif Gruenwoldt Punkte 13033

Ich habe dies angepasst solución die durch die Einnahme eines einfachen author-conv-file (das Format ist das gleiche wie bei git-cvsimport ). Es funktioniert, indem alle Benutzer, die in der author-conv-file über alle Branchen hinweg.

Wir haben dies in Verbindung mit cvs2git um unser Repository von cvs zu Git zu migrieren.

d.h. Probe author-conv-file

john=John Doe <john.doe@hotmail.com>
jill=Jill Doe <jill.doe@hotmail.com>

Das Drehbuch:

 #!/bin/bash

 export $authors_file=author-conv-file

 git filter-branch -f --env-filter '

 get_name () {
     grep "^$1=" "$authors_file" |
     sed "s/^.*=\(.*\) <.*>$/\1/"
 }

 get_email () {
     grep "^$1=" "$authors_file" |
     sed "s/^.*=.* <\(.*\)>$/\1/"
 }

 GIT_AUTHOR_NAME=$(get_name $GIT_COMMITTER_NAME) &&
     GIT_AUTHOR_EMAIL=$(get_email $GIT_COMMITTER_NAME) &&
     GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME &&
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL &&
     export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
     export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
 ' -- --all

0 Stimmen

Danke, ich frage mich, warum dies keine Kernfunktion von Git (oder Git-svn) ist. Dies kann mit einem Flag für git svn clone gemacht werden, aber nicht in git filter-branch...

19voto

drahnr Punkte 6555

Ich fand die vorgestellten Versionen viel zu aggressiv, vor allem, wenn man Patches von anderen Entwicklern einbindet, denn dadurch wird deren Code im Wesentlichen gestohlen.

Die folgende Version funktioniert auf allen Zweigen und ändert den Autor und den Verfasser separat, um dies zu verhindern.

Vielen Dank an leif81 für die Option "Alle".

#!/bin/bash

git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "<old author>" ];
then
    GIT_AUTHOR_NAME="<new author>";
    GIT_AUTHOR_EMAIL="<youmail@somehost.ext>";
fi
if [ "$GIT_COMMITTER_NAME" = "<old committer>" ];
then
    GIT_COMMITTER_NAME="<new commiter>";
    GIT_COMMITTER_EMAIL="<youmail@somehost.ext>";
fi
' -- --all

19voto

Lie Ryan Punkte 57966

Der schnellste und einfachste Weg ist die Verwendung des --exec-Arguments von git rebase:

git rebase -i -p --exec 'git commit --amend --reset-author --no-edit'

Dadurch wird eine ToDo-Liste erstellt, die wie folgt aussieht:

pick ef11092 Blah blah blah
exec git commit --amend --reset-author --no-edit
pick 52d6391 Blah bloh bloo
exec git commit --amend --reset-author --no-edit
pick 30ebbfe Blah bluh bleh
exec git commit --amend --reset-author --no-edit
...

und das funktioniert alles automatisch, was bei Hunderten von Übertragungen funktioniert.

0 Stimmen

Sie können ersetzen -p con --root zu ändern todo Commits in der Historie (Die Option -p ist veraltet). Und beachten Sie, dass dies nur funktioniert, nachdem Sie den Benutzernamen und die E-Mail über git config user.name <yourname> y git config user.email <youremail> .

1 Stimmen

Ich habe ein Repository, an dem ich zusammen mit einem anderen Mitarbeiter gearbeitet habe. Ich möchte alle meine die Referenzen der Commits. Ist Ihr Vorschlag in diesem Fall sicher, um jede Änderung an den Commits der anderen Beteiligten zu vermeiden?

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