Jak zmienić autora commita dla jednego konkretnego commita?

Chcę zmienić autora jednego konkretnego commita w historii. To nie ostatnie zobowiązanie.

Wiem o tym pytaniu- Jak zmienić autora commita w git?

Ale myślę o czymś, gdzie identyfikuję commit przez hash lub short-hash.

 1445

9 answers

Interactive rebase off z punktu wcześniejszego w historii niż commit, który musisz zmodyfikować (git rebase -i <earliercommit>). Na liście zmian zmienianych, Zmień tekst z pick na edit obok skrótu tego, który chcesz zmodyfikować. Następnie, gdy git poprosi Cię o zmianę commita, użyj tego:

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

Na przykład, jeśli Twoja historia zmian to A-B-C-D-E-F z F jako HEAD i chcesz zmienić autora C i D, to możesz to zrobić...

  1. określić git rebase -i B (oto przykład tego, co zobaczysz po wykonaniu git rebase -i B polecenia )
    • jeśli chcesz edytować A, użyj git rebase -i --root
  2. Zmień linie dla C i D z pick na edit
  3. po uruchomieniu rebase, najpierw zatrzymuje się na C
  4. zrobiłbyś git commit --amend --author="Author Name <[email protected]>"
  5. Then git rebase --continue
  6. zatrzyma się ponownie na D
  7. wtedy byś git commit --amend --author="Author Name <[email protected]>" znowu
  8. git rebase --continue
  9. rebase by kompletna.
  10. użyj git push -f, aby zaktualizować swoje pochodzenie za pomocą zaktualizowanych commitów.
 2445
Author: Amber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-16 20:36:38

The accepted answer to cudownie sprytne użycie interaktywnego rebase, ale niestety wykazuje konflikty, jeśli commit, który staramy się zmienić, był kiedyś na gałęzi, która następnie została połączona. Ogólnie rzecz biorąc, nie działa podczas obsługi niechlujnych historii.

Ponieważ boję się uruchamiać skrypty, które zależą od ustawiania i wyłączania zmiennych środowiskowych do przepisywania historii Gita, piszę nową odpowiedź na podstawie ten post {[14] } który jest podobny do ta odpowiedź ale jest bardziej kompletna.

Poniższe jest testowane i działa, w przeciwieństwie do odpowiedzi linked. Załóżmy dla jasności, że 03f482d6 jest commit, którego autora staramy się zastąpić, a {[8] } jest commit z nowym autorem.

  1. Sprawdź commit, który próbujemy zmodyfikować.

    git checkout 03f482d6
    
  2. Zmień autora.

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

    Teraz mamy nowy commit z hash przyjmuje się, że 42627abe.

  3. Sprawdź oryginalną gałąź.

  4. Zastąp Stary commit nowym lokalnie.

    git replace 03f482d6 42627abe
    
  5. Przepisz wszystkie przyszłe commity na podstawie wymiany.

    git filter-branch -- --all
    
  6. Usuń zamiennik dla czystości.

    git replace -d 03f482d6
    
  7. Popchnij nową historię (użyj tylko --force, Jeśli poniższe polecenie nie powiedzie się, i tylko po sprawdzeniu przez git log i/lub git diff).

    git push --force-with-lease
    

Zamiast 4-6 możesz po prostu przełączyć na nowy commit:

git rebase -i 42627abe
 334
Author: merlin2011,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-09 16:58:34

Dokumentacja Github zawiera skrypt, który zastępuje informacje o zatwierdzeniu dla wszystkich zatwierdzeń w gałęzi .

#!/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
 139
Author: olivieradam666,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-23 08:12:26

Możesz zmienić autora ostatniego commita używając poniższego polecenia.

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

Jednakże, jeśli chcesz zmienić więcej niż jedną nazwę autora commitów, jest to trochę trudne. Musisz uruchomić interaktywną rebase, następnie oznaczyć commity jako edit, następnie dodać je jeden po drugim i zakończyć.

Zacznij rebasing od git rebase -i. Pokaże ci coś takiego.

/ images/content/3042437 / eac7081efe7597e310c8b962fb1cb8e2.png

Zmień słowo kluczowe pick na edit dla commitów, które chcesz zmienić nazwisko.

/ images/content/3042437 / 6fdcf235bda0c47d7304d2a239de7a49.png

Następnie zamknij Edytor. Dla początkujących naciśnij Escape, Następnie wpisz :wq i naciśnij Enter.

Wtedy zobaczysz swój terminal, jakby nic się nie stało. W rzeczywistości jesteś w środku interaktywnej rebazy. Teraz nadszedł czas, aby zmienić nazwę autora twojego commita, używając powyższej komendy. Ponownie otworzy Edytor. Zakończ i kontynuuj rebase za pomocą git rebase --continue. Powtórz to samo dla liczby zatwierdzeń, które chcesz edytować. Możesz upewnić się, że interaktywna rebase została zakończona, gdy otrzymujesz No rebase in progress? wiadomość.
 61
Author: Fatih,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-29 00:52:24
  • Zresetuj swój e-mail do konfiguratora:

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

  • Teraz zresetuj autora twojego commita bez konieczności edycji:

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

 59
Author: pravbeatle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 07:12:36

Odpowiedzi w pytaniu, do którego podlinkowałeś, są dobre i obejmują twoją sytuację (drugie pytanie jest bardziej ogólne, ponieważ polega na przepisaniu wielu commitów).

Jako pretekst do wypróbowania git filter-branch, napisałem skrypt do przepisania nazwiska autora i / lub e-maila autora dla danego commita:

#!/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
 47
Author: Chris Johnsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-18 16:34:04

Podczas robienia {[3] } w doc jest taki ciekawy bit:

Jeśli chcesz złożyć dwa lub więcej commitów w jeden, zamień polecenie "pick" dla drugiego i kolejnych commitów na "squash" lub "fixup". Jeśli commity miały różnych autorów, złożony commit zostanie przypisany autorowi pierwszego commita. Sugerowana wiadomość commit dla złożonego commita jest połączeniem komunikatów commit pierwszego commita i tych z Komendą "squash", ale pomija komunikaty commitów commitów za pomocą polecenia "fixup".

  • jeśli masz historię A-B-C-D-E-F,
  • i chcesz zmienić commity B i D (=2 commity),

Wtedy możesz zrobić:

  • git config user.name "Correct new name"
  • git config user.email "[email protected]"
  • Utwórz puste commity (po jednym dla każdego commita):
    • potrzebujesz wiadomości dla celu rebase
    • git commit --allow-empty -m "empty"
  • rozpocznij operację rebase
    • git rebase -i B^
    • B^ wybiera rodzica B.
  • będziesz chciał umieścić jeden pusty commit przed każdy commit, aby zmodyfikować
  • będziesz chciał zmienić pick na squash dla tych.

Przykład tego, cogit rebase -i B^ da ci:

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

Zmień to na:

# 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

Wyświetli monit o edycję wiadomości:

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

I możesz po prostu usunąć kilka pierwszych linijek.

 12
Author: dnozay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-28 01:03:14

Jeśli korzystasz z scentralizowanego repozytorium, jest jeszcze jeden krok do odpowiedziAmber:

git push -f wymusić aktualizację centralnego repozytorium.

Uważaj, że nie ma wielu ludzi pracujących na tej samej gałęzi, ponieważ może to zrujnować spójność.

 11
Author: Fabian76,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:53

Zatwierdź przed:

Tutaj wpisz opis obrazka

Aby naprawić Autor dla wszystkich commitów, możesz zastosować polecenie z odpowiedzi @ Amber:

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

Lub aby ponownie użyć swojego imienia i adresu e-mail, możesz po prostu napisać:

git commit --amend --author=Eugen

Commit po komendzie:

Tutaj wpisz opis obrazka

Na przykład, aby zmienić wszystkie zaczynając od 4025621:

Tutaj wpisz opis obrazka

Musisz uruchomić:

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

Lub dodaj ten alias do ~/.gitconfig:

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

A następnie uruchom:

git reauthor 4025621 Eugen
 2
Author: Eugen Konkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 12:16:07