Hoe verander je de commit auteur voor één specifieke commit?

Ik wil de auteur van één specifieke commit in de geschiedenis veranderen. Het is niet de laatste commit.

Ik weet van deze vraag - Hoe verander ik de auteur van een commit in git?

Maar ik denk aan iets, waarbij ik de commit identificeer door hash of short-hash.

Oplossing

Interactieve rebase van een punt eerder in de geschiedenis dan de commit die je wilt wijzigen (git rebase -i). In de lijst van commits die gerebaset worden, verander je de tekst van pick naar edit naast de hash van de commit die je wilt wijzigen. Als git je dan vraagt om de commit te veranderen, gebruik dan dit:

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

Bijvoorbeeld, als je commit geschiedenis A-B-C-D-E-F is met F als HEAD, en je wilt de auteur van C en D veranderen, dan zou je...

  1. Geef git rebase -i B op (hier is een voorbeeld van wat je te zien krijgt na het uitvoeren van het git rebase -i B commando)
  • als je A moet bewerken, gebruik dan git rebase -i --root
  1. verander de regels voor zowel C als D van pick in edit
  2. Zodra de rebase is gestart, zou het eerst pauzeren bij C
  3. Je zou git commit --amend --author="Author Name "
  4. Dan git rebase --continue
  5. Het zou weer pauzeren bij D
  6. Dan zou je git commit --amend --author="Author Name " weer doen
  7. git rebase --continue
  8. De rebase zou voltooid worden.
  9. Gebruik git push -f om je origin bij te werken met de bijgewerkte commits.
Commentaren (44)

De antwoorden in de vraag waarnaar je linkte zijn goede antwoorden en dekken jouw situatie (de andere vraag is algemener omdat het gaat om het herschrijven van meerdere commits).

Als een excuus om git filter-branch uit te proberen, heb ik een script geschreven om de Auteur Naam en/of Email van de Auteur voor een gegeven commit te herschrijven:

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

Als je git rebase -i doet, staat er dit interessante stukje in de doc:

Als je twee of meer commits in één wilt vouwen, vervang dan het commando "pick" voor de tweede en volgende commits door "squash" of "fixup". Als de commits verschillende auteurs hadden, dan zal de geplooide commit aan de auteur van de eerste commit toegeschreven worden. De voorgestelde commit boodschap voor de gevouwen commit is de aaneenschakeling van de commit boodschappen van de eerste commit en van die met het "squash" commando, maar laat de commit boodschappen van commits met het "fixup" commando weg.

  • Als je een historie hebt van A-B-C-D-E-F,
  • en je wilt commits B en D (= 2 commits) wijzigen,

dan kun je dat doen:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • maak lege commits aan (één voor elke commit):
  • je hebt een bericht nodig voor rebase doel
  • git commit --allow-empty -m "empty"
  • start de rebase operatie
  • git rebase -i B^
  • B^ selecteert de ouder van B.
  • je zult een lege commit vóór elke commit willen zetten om te wijzigen
  • je zult pick in squash moeten veranderen voor deze.

Voorbeeld van wat git rebase -i B^ je zal geven:

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

verander dat in:

# 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

Het zal u vragen om de berichten te bewerken:

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

en je kunt gewoon de eerste paar regels verwijderen.

Commentaren (0)