Miten vaihtaa yhden tietyn toimituksen tekijä?

Haluan vaihtaa yhden tietyn toimituksen tekijän historiassa. Se ei ole viimeinen toimitus.

Tiedän tästä kysymyksestä - Miten vaihdan commitin tekijän gitissä?.

Mutta ajattelen jotain, jossa tunnistan commitin hashin tai short-hashin avulla.

Ratkaisu

Interaktiivinen uudelleenkäyttö aikaisemmasta kohdasta historiassa kuin se komitoitus, jota haluat muuttaa (git rebase -i). Vaihda uudelleenperustettavien komitusten luettelossa sen komituksen, jota haluat muuttaa, hashin vieressä oleva teksti pick:stä edit:ksi. Sitten kun git pyytää sinua muuttamaan toimitusta, käytä tätä:

git commit --amend --author="Author Name "

Jos esimerkiksi komentohistoriasi on A-B-C-D-E-F, jossa F on HEAD, ja haluat vaihtaa C:n ja D:n kirjoittajan, niin...

  1. Määritä git rebase -i B (tässä on esimerkki siitä, mitä näet komennon git rebase -i B suorittamisen jälkeen).
  • jos haluat muokata A:ta, käytä git rebase -i --root.
  1. vaihda sekä C:n että D:n rivit pick:stä edit:ksi.
  2. Kun rebase alkaa, se pysähtyy ensin kohtaan C.
  3. Teet git commit --amend --author="Author Name "
  4. Sitten git rebase --continue.
  5. Se pysähtyisi jälleen kohtaan D.
  6. Sitten git commit --amend --author="Author Name " uudelleen
  7. git rebase --continue
  8. Uudelleenasennus saataisiin päätökseen.
  9. Käytä git push -f päivittääksesi origon päivitetyillä komennoilla.
Kommentit (44)

Linkittämäsi kysymyksen vastaukset ovat hyviä vastauksia ja kattavat tilanteesi (toinen kysymys on yleisempi, koska siihen liittyy useiden komentojen uudelleenkirjoittaminen).

Tekosyynä kokeillakseni git filter-branchia kirjoitin skriptin, joka kirjoittaa uudelleen tekijän nimen ja/tai tekijän sähköpostin tietylle toimitukselle:

#!/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
Kommentit (9)

Kun teet git rebase -i, dokumentissa on tämä mielenkiintoinen kohta:

Jos haluat yhdistää kaksi tai useampia komentoja yhdeksi, korvaa komento "pick" toisen ja sitä seuraavien komentojen osalta komennolla "squash" tai "fixup". Jos komennoilla oli eri kirjoittajat, taitetun komennon kirjoittaja on ensimmäisen komennon kirjoittaja. Taitetun komennon ehdotettu komentoviesti on ensimmäisen komennon ja komennon "squash" komennolla tehtyjen komentojen komentoviestien yhdistelmä, mutta siitä jätetään pois komentojen komentoviestit, joissa on komento "fixup".

  • Jos sinulla on historia A-B-C-D-E-F,
  • ja haluat muuttaa kommitit B ja D (= 2 kommittiä),

voit tehdä näin:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • luo tyhjiä komituksia (yksi jokaiselle komitukselle):
  • tarvitset viestin rebase-tarkoituksessa
  • git commit --allow-empty -m "empty"
  • käynnistä rebase-operaatio
  • git rebase -i B^
  • B^ valitsee B:n vanhemman.
  • haluat laittaa yhden tyhjän commitin ennen jokaista muokattavaa commitia.
  • haluat vaihtaa pick tilalle squash.

Esimerkki siitä, mitä git rebase -i B^ antaa sinulle:

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

muuta se seuraavasti:

# 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

Se pyytää sinua muokkaamaan viestejä:

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

ja voit vain poistaa muutaman ensimmäisen rivin.

Kommentit (0)