Vēlos mainīt viena konkrēta ieraksta autoru vēsturē. Tas nav pēdējais ieraksts.
Es zinu par šo jautājumu - Kā es varu mainīt autoru git sistēmā?.
Bet es domāju par kaut ko tādu, kur es identificēju commit pēc hash vai short-hash.
Interaktīvā pārbāze no agrākā vēstures punkta, kas ir agrāks par to, kuru vēlaties mainīt (git rebase -i <agrāka apņemšanās>
). Pārbāzēto nodevumu sarakstā mainiet tekstu no pick
uz edit
blakus tā nodevuma hash, kuru vēlaties modificēt. Tad, kad git lūgs mainīt nodevumu, izmantojiet šo:
git commit --amend --author="Author Name <[email protected]>"
Piemēram, ja jūsu izmaiņu vēsture ir A-B-C-D-E-F
ar F
kā HEAD
, un jūs vēlaties mainīt C
un D
autoru, tad jūs...
git rebase -i B
(šeit ir piemērs tam, ko redzēsiet pēc komandas git rebase -i B
izpildīšanas).A
, izmantojiet git rebase -i --root
.C
un D
rindas no pick
uz edit
.C
.git commit --amend --author="Autora vārds <[email protected]>"
git rebase --continue
D
git commit --amend --author="Author Name <[email protected]>"
.git rebase --continue
git push -f
, lai atjauninātu savu oriģinālvalsti ar atjauninātajām nodevām.Atbildes uz jautājumu, uz kuru jūs atsaucāties, ir labas atbildes un attiecas uz jūsu situāciju (otrs jautājums ir vispārīgāks, jo tas ietver vairāku nodevumu pārrakstīšanu).
Lai izmēģinātu git filter-branch
, es uzrakstīju skriptu, lai pārrakstītu autora vārdu un/vai e-pasta adresi konkrētai kopijai:
#!/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
Veicot git rebase -i
, dokumentācijā ir šis interesantais teksts:
Ja vēlaties salikt divas vai vairāk nodevumus vienā, aizstāt komandu
"pick"
otrajam un turpmākajiem nodevumiem ar"squash"
vai"fixup"
. Ja kopiju autori bija dažādi, saliktā kopija tiks attiecināta uz pirmās kopijas autoru. Ierosinātais saliktās kopijas kopijas ziņojums ir pirmās kopijas un kopiju ar&"squash"
komandu kopiju ziņojumu konkatenācija, bet izlaiž kopiju ar"fixup"
komandu kopiju ziņojumus.
A-B-C-D-E-F
vēsture,B
un D
(= 2 nodevumi),tad varat veikt:
git config user.name "Correct new name"
git config user.email "[email protected]"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
atlasa B
vecāku.pick
uz squash
.Piemērs, ko git rebase -i B^
jums dos:
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
mainiet to uz:
# 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
Jums tiks piedāvāts rediģēt ziņojumus:
# 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...
un jūs varat vienkārši izdzēst dažas pirmās rindiņas.