wake-up-neo.net

Wie ändere ich den Autor eines Commits für ein bestimmtes Commit?

Ich möchte den Autor eines bestimmten Commits in der Geschichte ändern. Es ist nicht das letzte Commit.

Ich kenne diese Frage - Wie ändere ich den Autor eines Commits in git?

Aber ich denke über etwas nach, bei dem ich das Commit durch Hash oder Short-Hash identifiziere.

1821
MicTech

Interaktives Zurücksetzen eines Punkts in der Historie vor dem zu ändernden Commit (git rebase -i <earliercommit>). Ändern Sie in der Liste der neu basierenden Commits den Text von pick in edit neben dem Hash des zu ändernden. Wenn git Sie dann auffordert, das Commit zu ändern, verwenden Sie Folgendes:

git commit --amend --author="Author Name <[email protected]>"

Wenn Ihr Commit-Verlauf beispielsweise A-B-C-D-E-F mit F als HEAD ist und Sie den Autor von C und D ändern möchten, dann würden Sie. ..

  1. Geben Sie git rebase -i B ( hier ist ein Beispiel dafür, was Sie nach der Ausführung des Befehls git rebase -i B sehen werden )
    • wenn Sie A bearbeiten müssen, verwenden Sie git rebase -i --root
  2. ändern Sie die Zeilen für C und D von pick in edit
  3. Sobald der Rebase gestartet wurde, pausierte er zuerst bei C
  4. Sie würden git commit --amend --author="Author Name <[email protected]>"
  5. Dann git rebase --continue
  6. Bei D würde es erneut pausieren
  7. Dann würdest du git commit --amend --author="Author Name <[email protected]>" noch einmal
  8. git rebase --continue
  9. Die Rebase würde abgeschlossen sein.
  10. Verwenden Sie git Push -f, um Ihren Origin mit den aktualisierten Commits zu aktualisieren.
3079
Amber

Die akzeptierte Antwort auf diese Frage ist eine wunderbar clevere Verwendung von interaktiver Rebase, weist jedoch leider Konflikte auf, wenn das Commit, das wir versuchen, den Autor zu ändern, sich in einem Zweig befand, der anschließend zusammengeführt wurde. Im Allgemeinen funktioniert es nicht beim Umgang mit unordentlichen Verläufen.

Da ich befürchte, Skripte auszuführen, die vom Setzen und Deaktivieren von Umgebungsvariablen abhängen, um den Git-Verlauf neu zu schreiben, schreibe ich eine neue Antwort basierend auf diesem Beitrag , die dieser Antwort ähnelt ist aber vollständiger.

Das Folgende ist getestet und funktioniert im Gegensatz zur verknüpften Antwort. Nehmen Sie zur Klarheit der Darstellung an, dass 03f482d6 der Commit ist, dessen Autor wir ersetzen möchten, und 42627abe der Commit mit dem neuen Autor ist.

  1. Überprüfen Sie das Commit, das wir ändern möchten.

    git checkout 03f482d6
    
  2. Ändern Sie den Autor.

    git commit --amend --author "New Author Name <New Author Email>"
    

    Jetzt haben wir ein neues Commit mit dem Hashwert 42627abe.

  3. Überprüfen Sie die ursprüngliche Filiale.

  4. Ersetzen Sie das alte Commit lokal durch das neue.

    git replace 03f482d6 42627abe
    
  5. Schreiben Sie alle zukünftigen Commits basierend auf dem Ersatz neu.

    git filter-branch -- --all
    
  6. Entfernen Sie den Ersatz für die Sauberkeit.

    git replace -d 03f482d6
    
  7. Übertragen Sie den neuen Verlauf (verwenden Sie --force nur, wenn der unten stehende Fehler auftritt, und erst nach Überprüfung der Integrität mit git log und/oder git diff).

    git Push --force-with-lease
    

Anstelle von 4-6 können Sie auch einfach auf ein neues Commit zurückgreifen:

git rebase -i 42627abe
422
merlin2011

Die Github-Dokumentation enthält ein Skript, das die Committer-Informationen für alle Commits in einem Zweig ersetzt .

#!/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
189
olivieradam666
  • Setzen Sie Ihre E-Mail-Adresse global in die Konfiguration zurück:

    git config --global user.email [email protected]

  • Setzen Sie nun den Autor Ihres Commits zurück, ohne dass Änderungen erforderlich sind:

    git commit --amend --reset-author --no-edit

120
pravbeatle

Sie können den Autor des letzten Commits mit dem folgenden Befehl ändern.

git commit --amend --author="Author Name <[email protected]>"

Wenn Sie jedoch mehr als einen Autorennamen ändern möchten, ist dies etwas schwierig. Sie müssen eine interaktive Rebase starten, dann Commits als Bearbeiten markieren, dann nacheinander ändern und fertig stellen.

Starten Sie mit git rebase -i eine neue Basis. Es wird dir so etwas zeigen.

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

Ändern Sie das Schlüsselwort pick in edit für die Commits, für die Sie den Namen des Autors ändern möchten.

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

Dann schließen Sie den Editor. Für Anfänger drücken Sie Escape, geben Sie :wq ein und drücken Sie Enter.

Dann sehen Sie Ihr Terminal, als wäre nichts passiert. Eigentlich befinden Sie sich mitten in einer interaktiven Rebase. Nun ist es an der Zeit, den Autorennamen Ihres Commits mit dem obigen Befehl zu ändern. Der Editor wird erneut geöffnet. Beenden Sie und fahren Sie mit git rebase --continue fort. Wiederholen Sie dies für die Anzahl der Commits, die Sie bearbeiten möchten. Sie können sicherstellen, dass der interaktive Rebase-Vorgang abgeschlossen ist, wenn Sie die Nachricht No rebase in progress? erhalten.

76
Fatih

Die Antworten in der Frage, mit der Sie verknüpft sind, sind gute Antworten und decken Ihre Situation ab (die andere Frage ist allgemeiner, da mehrere Festschreibungen erforderlich sind).

Als Entschuldigung, um git filter-branch auszuprobieren, habe ich ein Skript geschrieben, um den Autorennamen und/oder die Autoren-E-Mail für ein bestimmtes Commit umzuschreiben:

#!/bin/sh

#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
#     If -f is supplied it is passed to "git filter-branch".
#
#     If <branch-to-rewrite> is not provided or is empty HEAD will be used.
#     Use "--all" or a space separated list (e.g. "master next") to rewrite
#     multiple branches.
#
#     If <new-name> (or <new-email>) is not provided or is empty, the normal
#     user.name (user.email) Git configuration value will be used.
#

force=''
if test "x$1" = "x-f"; then
    force='-f'
    shift
fi

die() {
    printf '%s\n' "[email protected]"
    exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"

TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL

filt='

    if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
        if test -n "$TARG_EMAIL"; then
            GIT_AUTHOR_EMAIL="$TARG_EMAIL"
            export GIT_AUTHOR_EMAIL
        else
            unset GIT_AUTHOR_EMAIL
        fi
        if test -n "$TARG_NAME"; then
            GIT_AUTHOR_NAME="$TARG_NAME"
            export GIT_AUTHOR_NAME
        else
            unset GIT_AUTHOR_NAME
        fi
    fi

'

git filter-branch $force --env-filter "$filt" -- $br
51
Chris Johnsen

Festschreiben vor:

enter image description here

Um den Autor für alle Commits festzulegen, können Sie den Befehl aus der Antwort von @ Amber anwenden:

git commit --amend --author="Author Name <[email protected]>"

Oder schreiben Sie einfach, um Ihren Namen und Ihre E-Mail-Adresse wiederzuverwenden:

git commit --amend --author=Eugen

Festschreiben nach dem Befehl:

enter image description here

Zum Beispiel, um alle ab 4025621 zu ändern:

enter image description here

Du musst rennen:

git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621

Hinweis: Um einen Autor mit Leerzeichen wie Name und E-Mail-Adresse einzuschließen, muss der Autor in Anführungszeichen eingeschlossen sein. Zum Beispiel:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <[email protected]>\"" 4025621

oder füge diesen Alias ​​in ~/.gitconfig ein:

[alias]
    reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --

Und dann renne:

git reauthor 4025621 Eugen
28
Eugen Konkov

Es gibt einen zusätzlichen Schritt zu Bernsteins Antwort , wenn Sie ein zentrales Repository verwenden:

git Push -f, um die Aktualisierung des zentralen Repositorys zu erzwingen.

Achten Sie darauf, dass nicht viele Personen an demselben Zweig arbeiten, da dies die Konsistenz beeinträchtigen kann.

15
Fabian76

Wenn Sie git rebase -i machen, gibt es dieses interessante Bit im Dokument:

Wenn Sie zwei oder mehr Commits zu einem zusammenfassen möchten, ersetzen Sie den Befehl "pick" für den zweiten und die folgenden Commits durch "squash" oder "fixup". Wenn die Commits unterschiedliche Autoren hatten, wird das gefaltete Commit dem Autor des ersten Commits zugeordnet. Die vorgeschlagene Festschreibungsnachricht für die gefaltete Festschreibung ist die Verkettung der Festschreibungsnachrichten der ersten Festschreibung und derjenigen mit dem Befehl "squash", lässt jedoch die Festschreibungsnachrichten der Festschreibungen mit dem Befehl "fixup" aus.

  • Wenn Sie eine Geschichte von A-B-C-D-E-F haben,
  • und Sie möchten die Commits B und D ändern (= 2 Commits),

dann kannst du machen:

  • git config user.name "Correct new name"
  • git config user.email "[email protected]"
  • erstellen Sie leere Commits (eines für jedes Commit):
    • sie benötigen eine Nachricht für den Rebase-Zweck
    • git commit --allow-empty -m "empty"
  • starten Sie die Rebase-Operation
    • git rebase -i B^
    • B^ wählt das übergeordnete Element von B aus.
  • sie möchten ein leeres Commit setzen vor jedes zu ändernde Commit
  • sie möchten pick in squash für diese ändern.

Beispiel dessen, 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

ändere das in:

# change commit B's 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's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message

Sie werden aufgefordert, die Nachrichten zu bearbeiten:

# This is a combination of 2 commits.
# The first commit's message is:

empty

# This is the 2nd commit message:

...some useful commit message there...

und Sie können nur die ersten paar Zeilen entfernen.

13
dnozay

Um von der Antwort Eugen Konkov auszugehen, verwenden Sie das Flag --root, um mit dem Root-Commit zu beginnen. Das --no-edit -Flag ist ebenfalls hilfreich

git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
5
korwalskiy

Wenn es sich bei dem zu ändernden Commit nicht um das letzte Commit handelt, führen Sie die folgenden Schritte aus. Wenn sich Ihr Commit in einem anderen Zweig befindet, wechseln Sie zuerst in diesen Zweig.

git checkout branch_name

Suchen Sie das Commit vor dem Commit, das Sie ändern möchten, und suchen Sie den Hash. Geben Sie dann den Befehl rebase aus.

Git Rebase -i -p Hash von Commit

Dann öffnet sich ein Editor und gibt 'edit' für die Commits ein, die Sie ändern möchten. Belassen Sie andere mit der Standardauswahloption. Einmal geändert, geben Sie 'esc' ein und wq! beenden.

Geben Sie dann den Befehl git commit mit der Änderungsoption aus.

git commit --amend --author = "Benutzername email" --no-edit

Geben Sie dann den folgenden Befehl aus.

git rebase --continue

Sobald der Autor des Commits im lokalen Repository aktualisiert wurde, übertragen Sie die Änderungen in das Remote-Repository.

1
ChannaB

Wenn Sie den AUTHOR OF THE LAST-Commit ändern müssen und kein anderer Ihr Repository verwendet, können Sie den letzten Commit rückgängig machen mit:

git Push -f Origin last_commit_hash:branch_name 

ändern Sie den Autorennamen Ihres Commits mit:

git commit --amend --author "type new author here"

Beenden Sie den sich öffnenden Editor und geben Sie Ihren Code erneut ein:

git Push
1
pebox11

Es gibt auch einen trägen Ansatz für dieses Problem, insbesondere wenn Sie mehr als ein Commit haben, das Sie ändern möchten. In meinem Fall hatte ich eine neue Filiale mit mehreren Commits mit einem falschen Autor, was mir also geholfen hat:

Gehe zu deinem ursprünglichen Zweig:

git checkout develop

Neuen Zweig daraus erstellen:

git checkout -b myFeature develop 

Füge es ohne Festschreibungsinformationen als eine Festschreibung zusammen:

git merge --no-commit --squash branchWrongAuthor

Eventuell möchten Sie auch Änderungen vornehmen:

git stage .

Ändern Sie den Namen des Autors und übernehmen Sie die Änderungen:

git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"

nd das war's auch schon, du kannst die Änderungen pushen.

git Push

Danach können Sie den Zweig mit einem falschen Autor löschen.

1
alexlz

Schritte zum Umbenennen des Autornamens nach dem Festschreiben gedrückt

  1. Geben Sie zuerst "git log" ein, um die Festschreibungs-ID und weitere Details zu erhalten
  2. git rebase i HEAD ~ 10 (10 ist das gesamte Commit, das bei rebase angezeigt werden soll)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip)If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. Geben Sie dann nach Bedarf "git rebase --continue" oder "git rebase --abort" ein

    • klicken Sie auf die Taste "i" auf der Tastatur, um das Fenster "Will Rebase" zu öffnen
    • dann erhalten Sie eine Liste von Commits bis 10 (da wir 10 Commits oben übergeben haben)

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. Jetzt müssen Sie den Befehl below direkt unter dem Commit hinzufügen, den Sie bearbeiten möchten, wie unten

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <[email protected]>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <[email protected]>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <[email protected]>'

    1. Das war's, jetzt drücke einfach ESC,: wq und du bist fertig

    2. Dann git Push Origin HEAD: NAME DES NIEDERLASSUNGSZWEIGS -f [Bitte kümmern Sie sich um -f Force Push]

0
Kirtikumar A.