Frage

Ich möchte in der Geschichte den Autor einer bestimmten verpflichten ändern. Es wird nicht das letzte Mal begehen.

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

Aber ich denke an etwas, wo ich die von Hash-oder Kurz Hash-commit identifizieren.

War es hilfreich?

Lösung

Interaktive rebase eines Punktes früher in der Geschichte ab als der Commit Sie ändern müssen (git rebase -i <earliercommit>). In der Liste der Commits indexiert werden, um den Text von pick zu edit ändern Sie neben dem Hash-Wert des einen ändern möchten. Dann, wenn git Sie auffordert, die sich verpflichten, zu ändern, verwenden diese:

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

Zum Beispiel, wenn Ihre Geschichte begehen ist A-B-C-D-E-F mit F als HEAD, und Sie mögen den Autor von C und D ändern, dann würden Sie ...

  1. Geben Sie git rebase -i B ( hier ist ein Beispiel dafür, was Sie nach dem Ausführen des Befehls git rebase -i B sehen)
    • , wenn Sie benötigen bearbeiten A, Verwendung git rebase -i --root
  2. ändert die Linien sowohl für C und D von pick zu edit
  3. Sobald die rebase gestartet, wäre es zunächst bei C Pause
  4. Sie würde git commit --amend --author="Author Name <email@address.com>"
  5. Dann git rebase --continue
  6. Es würde Pause wieder bei D
  7. Dann würden Sie git commit --amend --author="Author Name <email@address.com>" wieder
  8. git rebase --continue
  9. Das Fütterungsmaterial würde abzuschließen.
  10. Verwenden Sie git push -f Ihren Ursprung mit den aktualisierten Commits aktualisieren.

Andere Tipps

Die akzeptierte Antwort auf diese Frage ist eine wunderbar geschickte Nutzung von interaktivem Unterfütterungsmaterial, aber es leider zeigt Konflikte, wenn die commit wir versuchen, den Autor verwendet werden auf einem Zweig zu ändern, die in der Folge verschmolzen wurde. Allgemeiner gesagt, es funktioniert nicht, wenn unordentlich Geschichten Handhabung.

Da ich besorgt bin über das Ausführen von Skripts, die Variablen auf Einstellung und Entschärfen Umgebung abhängen git Geschichte neu zu schreiben, ich bin eine neue Antwort zu schreiben, basierend auf aber ist mehr abgeschlossen.

Im Folgenden wird getestet und funktioniert, im Gegensatz zu der verknüpften Antwort. Es sei angenommen, für die Klarheit der Darstellung, dass 03f482d6 den Commit ist, dessen Autor wir zu ersetzen versuchen, und 42627abe ist die mit dem neuen Autor begehen.

  1. Zur Kasse die verpflichten wir uns zu ändern versuchen.

    git checkout 03f482d6
    
  2. Machen Sie den Autor ändern.

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

    Jetzt haben wir eine neue begehen mit Hash angenommen 42627abe sein.

  3. Zur Kasse des ursprüngliche Zweig.

  4. Ersetzen Sie die alte mit der neuen begehen vor Ort.

    git replace 03f482d6 42627abe
    
  5. Rewrite alle zukünftigen Commits auf der Grundlage des Ersatz.

    git filter-branch -- --all
    
  6. Den Ersatz für Sauberkeit.

    git replace -d 03f482d6
    
  7. Drücken Sie die neue Geschichte (--force nur verwenden, wenn die unten ausfällt, und erst nach Überprüfung geistiger Gesundheit mit git log und / oder git diff).

    git push --force-with-lease
    

Anstelle von 4-6 können Sie einfach auf neue rebase begehen:

git rebase -i 42627abe

Github Dokumentation enthält ein Skript, das die Committer Info für alle Commits in einem Zweig 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
  • Setzen Sie Ihre E-Mail an die Config global:

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

  • Reset nun den Autor Ihrer ohne bearbeiten verpflichten erforderlich:

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

Sie können Autor der letzten Änderung unter den Befehl commit verwenden.

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

Wenn Sie jedoch mehr als eine Commits Autor Namen ändern wollen, dann ist es ein bisschen schwierig. Sie benötigen einen interaktiven rebase starten dann Zeichen Commits als bearbeiten sie dann eins nach dem anderen und Ziel ammend.

Rebasing beginnen mit git rebase -i. Es zeigt Ihnen so etwas wie dieses.

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

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

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

Dann schließen Sie den Editor. Für die Anfänger, Hit Escape dann :wq und Hit Enter geben.

Dann werden Sie sehen, Ihr Terminal als wäre nichts passiert. Eigentlich sind Sie in der Mitte eines interaktiven Unterfütterungsmaterial. mit dem Befehl über Jetzt ist es Zeit zu ändern Ihre Autorennamen zu begehen. Es wird der Editor wieder öffnen. Beenden und weiter Fütterungsmaterial mit git rebase --continue. Wiederholen Sie das gleiche für das Commit zählen Sie bearbeiten möchten. Sie können sicherstellen, dass interaktive rebase beendet, wenn Sie die No rebase in progress? Meldung.

Die Antworten in der Frage, auf die Sie verknüpft sind gute Antworten und decken Sie Ihre Situation (die andere Frage ist allgemeiner, da es mehr Commits Umschreiben beinhaltet).

Als Vorwand git filter-branch auszuprobieren, schrieb ich ein Skript den Namen des Autors und / oder Autor E-Mail für eine Festschreibung gegeben 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

Commit vor:

 image description hier

eingeben

Um fix Autor für alle Commits Sie den Befehl @ Amber Antwort anwenden können:

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

oder Ihren Namen wieder zu verwenden und eine E-Mail einfach schreiben können:

git commit --amend --author=Eugen
Commit

nach dem Befehl:

 image description hier

eingeben

Zum Beispiel alle von 4025621 beginnen zu ändern:

 image description hier

eingeben

Sie müssen laufen:

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

Hinweis: Um einen Autor mit Leerzeichen wie Namen und E-Mail-Adresse, muss der Autor von entkam Anführungszeichen gesetzt werden. Zum Beispiel:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621

oder fügen Sie diesen Alias ??in ~/.gitconfig:

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

Und dann laufen:

git reauthor 4025621 Eugen

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

git push -f die Aktualisierung des zentralen Repository zu erzwingen.

Achten Sie darauf, dass es nicht viele Leute auf der gleichen Branche zu arbeiten, weil es Konsistenz ruinieren kann.

Wenn tun git rebase -i gibt es diese interessante Bit im doc:

  

Wenn Sie zwei falten wollen oder mehr Commits in ein, ersetzen Sie den Befehl "pick" für die zweite und die folgenden Commits mit "squash" oder "fixup". Wenn die Commits verschiedenen Autoren hatten, faltete die an den Autor des zugeschrieben werden begehen ersten begehen. Die vorgeschlagene Commit-Nachricht für den gefalteten begehen ist die Verkettung von den Commit-Nachrichten des ersten begehen und von denen mit dem "squash" Befehl, sondern läßt die Commit-Nachrichten von Commits mit dem "fixup" Befehl.

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

, dann können Sie tun:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • erstellen leer Commits (eine für jede Festschreibung):
    • Sie müssen eine Nachricht für rebase Zweck
    • git commit --allow-empty -m "empty"
  • Starten Sie den Fütterungsmaterial Operation
    • git rebase -i B^
    • B^ wählt die Eltern von B.
  • Sie wollen zu einem commit leer setzen, bevor jedem Commit
  • ändern
  • Sie ändern möchten pick zu squash für diejenigen.

Beispiel dafür, was git rebase -i B^ gibt Ihnen:

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

ändern, dass an:

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

Zur Förderung Eugen Konkov Reaktion zu starten, von der Wurzel zu begehen, verwenden --root Flagge. Die --no-edit Flagge ist ebenfalls hilfreich sein

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

Wenn das, was Sie ändern müssen der Autor der ist LAST begehen und keine andere ist mit Ihrem Repository, können Sie rückgängig machen Ihre letzten Commit mit:

git push -f origin last_commit_hash:branch_name 

den Namen des Autors des ändern begehen mit:

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

verlassen Sie den Editor, das sich öffnet und drücken Sie erneut Ihr Code:

git push

Es gibt auch einen faulen Ansatz für dieses Problem, vor allem, wenn Sie mehr als eine verpflichten, die Sie ändern möchten. In meinem Fall hatte ich eine Niederlassung mit mehreren Commits mit einem falschen Autor, also was mir geholfen:

Gehen Sie zu Ihrem ursprünglichen Zweig:

git checkout develop

Neue Niederlassung von ihm:

git checkout -b myFeature develop 

Merge es ohne Info zu begehen als ein commit:

git merge --no-commit --squash branchWrongAuthor

Sie mögen vielleicht auch auf der Bühne Änderungen:

git stage .

Ändern Sie den Namen des Autors und verpflichten Änderungen:

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

Und das ist es, können Sie die Änderungen drücken.

git push

Sie können den Zweig mit einem falschen Autor danach gelöscht werden.

Wenn die verpflichten, die Sie ändern wollen, ist nicht das letzte Mal begehen, dann folgen Sie die folgenden Schritte aus. Wenn Ihr commit in anderen Zweig ist dann erste Schalter auf diesen Zweig.

git Kasse branch_name

Suchen verpflichten, bevor der Commit, die Sie ändern wollen und seinen Hash zu finden. Dann Ausgabe rebase Befehl.

git rebase -i -p Hash commit

Dann wird ein Editor öffnen und geben Sie ‚Bearbeiten‘ für die Commits, die Sie ändern möchten. Lassen Sie andere mit default 'Pick' Option. Sobald geändert eingeben ‚esc‘ und wq! zu beenden.

Dann Ausgabe von git-Befehl mit Änderung Option begehen.

git commit --amend --author = "Benutzername E-Mail" --no-bearbeiten

Sie dann den folgenden Befehl eingeben.

git rebase --continue

Sobald verpflichten Autor im lokalen Repository aktualisiert wird, drücken Sie die Änderungen an der Remote-Repository.

Schritte Autorennamen umbenennen, nachdem gedrückt commit

  1. Erste Typ "git log", um die Commit-ID und weitere Details
  2. git rebase i HEAD ~ 10 (10 ist die Gesamt begehen auf rebase anzuzeigen)

    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 "git rebase --continue" oder "git rebase --abort" nach Ihren Bedarf

    • jetzt Ihr Wille rebase Fenster geöffnet, klicken Sie auf "i" Taste von der Tastatur
    • , dann werden Sie die Liste von Commits bekommen 10 [denn wir haben 10 bestanden begehen oben] Wie unten

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. Nun müssen Sie unter Befehl hinzufügen knapp unterhalb des begehen Sie bearbeiten möchten, wie unter

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <author.name@mail.com>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>'

    1. Das ist es, drücken Sie jetzt nur ESC,: wq und Sie sind alle gesetzt

    2. Dann git push origin HEAD: Zweignamen -f [bitte kümmern -f Erzwingt push]

    wie git push -f oder git push origin HEAD: dev -f

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top