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.
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ć...
- określić
git rebase -i B
(oto przykład tego, co zobaczysz po wykonaniugit rebase -i B
polecenia )- jeśli chcesz edytować
A
, użyjgit rebase -i --root
- jeśli chcesz edytować
- Zmień linie dla
C
iD
zpick
naedit
- po uruchomieniu rebase, najpierw zatrzymuje się na
C
- zrobiłbyś
git commit --amend --author="Author Name <[email protected]>"
- Then
git rebase --continue
- zatrzyma się ponownie na
D
- wtedy byś
git commit --amend --author="Author Name <[email protected]>"
znowu git rebase --continue
- rebase by kompletna.
- użyj
git push -f
, aby zaktualizować swoje pochodzenie za pomocą zaktualizowanych commitów.
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.
-
Sprawdź commit, który próbujemy zmodyfikować.
git checkout 03f482d6
-
Zmień autora.
git commit --amend --author "New Author Name <New Author Email>"
Teraz mamy nowy commit z hash przyjmuje się, że
42627abe
. Sprawdź oryginalną gałąź.
-
Zastąp Stary commit nowym lokalnie.
git replace 03f482d6 42627abe
-
Przepisz wszystkie przyszłe commity na podstawie wymiany.
git filter-branch -- --all
-
Usuń zamiennik dla czystości.
git replace -d 03f482d6
-
Popchnij nową historię (użyj tylko --force, Jeśli poniższe polecenie nie powiedzie się, i tylko po sprawdzeniu przez
git log
i/lubgit diff
).git push --force-with-lease
Zamiast 4-6 możesz po prostu przełączyć na nowy commit:
git rebase -i 42627abe
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
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.
Zmień słowo kluczowe pick
na edit
dla commitów, które chcesz zmienić nazwisko.
Następnie zamknij Edytor. Dla początkujących naciśnij Escape
, Następnie wpisz :wq
i naciśnij Enter
.
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ść.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
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
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
iD
(=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 rodzicaB
.
- będziesz chciał umieścić jeden pusty commit przed każdy commit, aby zmodyfikować
- będziesz chciał zmienić
pick
nasquash
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.
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ść.
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:
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:
Na przykład, aby zmienić wszystkie zaczynając od 4025621
:
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
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