Kā nomainīt kopijas autoru vienai konkrētai kopijai?

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.

Risinājums

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). 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 "

Piemēram, ja jūsu izmaiņu vēsture ir A-B-C-D-E-F ar FHEAD, un jūs vēlaties mainīt C un D autoru, tad jūs...

  1. Norādiet git rebase -i B (šeit ir piemērs tam, ko redzēsiet pēc komandas git rebase -i B izpildīšanas).
  • ja nepieciešams rediģēt A, izmantojiet git rebase -i --root.
  1. mainiet C un D rindas no pick uz edit.
  2. Kad rebase ir sākusies, tā vispirms apstāsies pie C.
  3. Jūs git commit --amend --author="Autora vārds "
  4. Tad git rebase --continue
  5. Tas atkal apstāsies pie D
  6. Tad atkal git commit --amend --author="Author Name ".
  7. git rebase --continue
  8. Pārbase tiks pabeigta.
  9. Izmantojiet git push -f, lai atjauninātu savu oriģinālvalsti ar atjauninātajām nodevām.
Komentāri (44)

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  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  (or ) 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
Komentāri (9)

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.

  • Ja jums ir A-B-C-D-E-F vēsture,
  • un vēlaties mainīt nodevumus B un D (= 2 nodevumi),

tad varat veikt:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • izveidojiet tukšas kopijas (pa vienai katrai kopijai):
  • jums ir nepieciešams ziņojums rebase nolūkos
  • git commit --allow-empty -m "empty"
  • sāciet atkārtotas izvietošanas operāciju
  • git rebase -i B^
  • B^ atlasa B vecāku.
  • jūs vēlēsieties ievietot vienu tukšu kopiju **paredzams, ka pirms katras kopijas, ko modificēsiet, ievietosiet vienu tukšu kopiju.
  • tiem jūs vēlēsieties mainīt 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.

Komentāri (0)