Frage Wie ändere ich den Commit-Autor für einen bestimmten Commit?


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

Ich weiß über diese Frage - Wie ändere ich den Autor eines Commits in git?

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


1380
2018-06-15 04:00


Ursprung


Antworten:


Interaktive Wiederherstellung von einem früheren Punkt in der History als der Commit, den Sie ändern müssen (git rebase -i <earliercommit>). In der Liste der Commits, die rebasiert werden, ändern Sie den Text von pick zu edit neben dem Hash desjenigen, den Sie ändern möchten. Wenn git Sie dann auffordert, das Commit zu ändern, verwenden Sie Folgendes:

git commit --amend --author="Author Name <email@address.com>"

Zum Beispiel, wenn Ihr Commit-Verlauf ist A-B-C-D-E-F mit F wie HEAD, und Sie möchten den Autor von ändern C und DDann würdest du ...

  1. Angeben git rebase -i B (Hier sehen Sie ein Beispiel für das, was Sie nach der Ausführung von git rebase -i B Befehl)
    • wenn Sie bearbeiten müssen A, benutzen git rebase -i --root
  2. Ändern Sie die Linien für beide C und D von pick zu edit
  3. Sobald die Rebase gestartet wurde, würde sie zuerst pausieren C
  4. Du würdest git commit --amend --author="Author Name <email@address.com>"
  5. Dann git rebase --continue
  6. Es würde wieder bei pausieren D
  7. Dann würdest du es tun git commit --amend --author="Author Name <email@address.com>" nochmal
  8. git rebase --continue
  9. Die Rebase würde vervollständigt werden.

2315
2018-06-15 04:31



Das akzeptierte Antwort zu dieser Frage ist eine wunderbar schlaue Verwendung von interaktiven Rebase, aber es zeigt leider Konflikte, wenn das Commit, das wir versuchen, den Autor zu ändern, auf einem Zweig war, der später zusammengeführt wurde. Allgemeiner funktioniert es nicht, wenn unordentlich gehandhabt wird Geschichten.

Da ich Bedenken habe, Skripte auszuführen, die von der Einstellung und Unscharfschaltung von Umgebungsvariablen abhängen, schreibe ich eine neue Antwort auf dieser Beitrag das ist ähnlich diese Antwort aber ist vollständiger.

Das Folgende ist getestet und funktioniert, anders als die verknüpfte Antwort. Nehmen Sie zur Klarheit der Darstellung an, dass 03f482d6 ist das Commit, dessen Autor wir zu ersetzen versuchen, und 42627abe ist das Commit mit dem neuen Autor.

  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 Hash angenommen 42627abe.

  3. Überprüfen Sie den ursprünglichen Zweig.

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

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

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

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

    git push --force-with-lease
    

Statt 4-6 können Sie einfach auf neues Commit rebasieren:

git rebase -i 42627abe

311
2018-03-04 02:11



Github-Dokumentation enthält Ein Skript, das die Committer-Informationen für alle Commits in einer Verzweigung ersetzt.

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

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

128
2018-06-09 16:02



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

git commit --amend --author="Author Name <email@address.com>"

Wenn Sie jedoch mehr als einen Commit-Autorennamen ändern möchten, ist es ein bisschen schwierig. Sie müssen eine interaktive Rebase starten, dann commits als edit markieren und sie dann nacheinander bearbeiten und beenden.

Beginne mit dem Rebasing git rebase -i. Es wird dir so etwas zeigen.

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

Ändere das pick Schlüsselwort zu edit Für die Commits möchten Sie den Autorennamen ändern.

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

Dann schließe den Editor. Für die Anfänger, Hit Escape dann tippe ein :wq und hit Enter.

Dann werden Sie Ihr Terminal sehen, als wäre nichts passiert. Eigentlich sind Sie mitten in einer interaktiven Rebase. Jetzt ist es Zeit, den Autorennamen des Commits mit dem obigen Befehl zu ändern. Es öffnet den Editor erneut. Beenden und Fortsetzen von Rebase mit git rebase --continue. Wiederholen Sie dies für die Anzahl der Commits, die Sie bearbeiten möchten. Sie können sicherstellen, dass die interaktive Umbenennung abgeschlossen ist, wenn Sie die No rebase in progress? Botschaft.


60
2017-08-29 00:52



  • Setzen Sie Ihre E-Mail global auf die Konfiguration zurück:

    git config --global user.email example@email.com

  • Setzen Sie nun den Autor Ihres Commits zurück, ohne dass eine Bearbeitung erforderlich ist:

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


52
2018-04-05 12:44



Die Antworten in der Frage, auf die Sie verlinken, sind gute Antworten und decken Ihre Situation ab (die andere Frage ist allgemeiner, da es sich um das Neuschreiben mehrerer Commits handelt).

Als Ausrede zum Ausprobieren git filter-branchIch habe ein Skript geschrieben, um den Autornamen und / oder die Autoren-E-Mail für ein bestimmtes Commit neu zu schreiben:

#!/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' "$@"
    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

46
2018-06-15 05:24



Wenn es geht git rebase -i Es gibt dieses interessante Stück im Dokument:

Wenn Sie zwei oder mehr Commits zu einem falten möchten, ersetzen Sie den Befehl "pick" für die zweite und nachfolgende Commits mit "squash" oder "fixup". Wenn die Commits unterschiedliche Autoren hatten, wird der gefaltete Commit dem Autor des ersten Commits zugeordnet. Die vorgeschlagene Commit - Nachricht für das gefaltete Commit ist die Verkettung der Commit - Nachrichten des ersten Commits und derjenigen mit dem "squash" Befehl, aber die Commit - Nachrichten von Commits mit dem "fixup" Befehl.

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

dann kannst du:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • Erstellen Sie leere Commits (eine für jedes Commit):
    • Sie benötigen eine Nachricht für den Verwendungszweck
    • git commit --allow-empty -m "empty"
  • Starten Sie die Rebase-Operation
    • git rebase -i B^
    • B^ wählt das übergeordnete Element aus B.
  • Du wirst ein leeres Commit machen wollen Vor jeder verpflichtet sich zu modifizieren
  • du wirst dich ändern wollen pick zu squash für diejenigen.

Beispiel für was git rebase -i B^ werde dir geben:

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 zu:

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


12
2017-08-28 01:03



Es gibt einen zusätzlichen Schritt zu Ambers Antwort wenn Sie ein zentralisiertes Repository verwenden:

git push -f Erzwingen der Aktualisierung des zentralen Repository.

Achten Sie darauf, dass nicht viele Personen in derselben Branche arbeiten, da dies die Konsistenz beeinträchtigen kann.


11
2017-12-20 15:06



Commit vorher:

enter image description here

Um den Autor für alle Commits zu fixieren, können Sie den Befehl von @ Ambers Antwort anwenden:

git commit --amend --author="Author Name <email@address.com>"

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

git commit --amend --author=Eugen

Commit nach dem Befehl:

enter image description here

Zum Beispiel um alle von beginnen zu ändern 4025621:

enter image description here

Du musst rennen:

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

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

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

Und dann:

git reauthor 4025621 Eugen

1
2018-06-30 12:16