Vraag Hoe de commit-auteur voor één specifieke commit te veranderen?


Ik wil de auteur van een specifieke commit in de geschiedenis wijzigen. 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 met hash of short-hash.


1380
2018-06-15 04:00


oorsprong


antwoorden:


Interactieve rebase off van een punt eerder in de geschiedenis dan de commit die je moet aanpassen (git rebase -i <earliercommit>). Wijzig de tekst in de lijst met commits die worden gerebased pick naar edit naast de hash van degene die je wilt wijzigen. Wanneer git je dan vraagt ​​om de commit te veranderen, gebruik dan:

git commit --amend --author="Author Name <email@address.com>"

Als uw commit-geschiedenis bijvoorbeeld is A-B-C-D-E-F met F als HEAD, en u wilt de auteur van wijzigen C en D, dan zou je ...

  1. specificeren git rebase -i B (hier is een voorbeeld van wat u zult zien na het uitvoeren van de git rebase -i B opdracht)
    • als je moet bewerken A, gebruik git rebase -i --root
  2. verander de regels voor beide C en D van pick naar edit
  3. Zodra de rebase is gestart, wordt eerst gepauzeerd C
  4. Je zou git commit --amend --author="Author Name <email@address.com>"
  5. Dan git rebase --continue
  6. Het zou opnieuw stoppen bij D
  7. Dan zou je dat doen git commit --amend --author="Author Name <email@address.com>" nog een keer
  8. git rebase --continue
  9. De rebase zou aflopen.

2315
2018-06-15 04:31



De geaccepteerd antwoord op deze vraag is een wonderlijk slim gebruik van interactieve rebase, maar het vertoont helaas conflicten als de commit die we proberen te veranderen de auteur van was op een tak die vervolgens werd samengevoegd. Meer in het algemeen werkt het niet bij rommelig omgaan geschiedenissen.

Omdat ik ongerust ben over het uitvoeren van scripts die afhankelijk zijn van het instellen en uitschakelen van omgevingsvariabelen om de geschiedenis van git te herschrijven, schrijf ik een nieuw antwoord op basis van deze post die vergelijkbaar is met dit antwoord maar is completer.

Het volgende is getest en werkt, in tegenstelling tot het gekoppelde antwoord. Stel voor duidelijkheid van expositie dat 03f482d6 is de commit waarvan we de auteur proberen te vervangen, en 42627abe is de commit met de nieuwe auteur.

  1. Controleer de commit die we proberen te wijzigen.

    git checkout 03f482d6
    
  2. Laat de auteur veranderen.

    git commit --amend --author "New Author Name <New Author Email>"
    

    Nu hebben we een nieuwe commit met hash verondersteld te zijn 42627abe.

  3. Bekijk de originele tak.

  4. Vervang de oude commit lokaal door de nieuwe.

    git replace 03f482d6 42627abe
    
  5. Herschrijf alle toekomstige commits op basis van de vervanging.

    git filter-branch -- --all
    
  6. Verwijder de vervanging voor reinheid.

    git replace -d 03f482d6
    
  7. Druk op de nieuwe geschiedenis (gebruik alleen --force als het onderstaande mislukt, en pas nadat de functie voor gezond verstand is gecontroleerd) git log en / of git diff).

    git push --force-with-lease
    

In plaats van 4-6 kun je gewoon rebasen op nieuwe commit:

git rebase -i 42627abe

311
2018-03-04 02:11



Github-documentatie bevat een script dat de committer-info vervangt voor alle commits in een filiaal.

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

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

128
2018-06-09 16:02



Je kunt de auteur van de laatste commit wijzigen met de onderstaande opdracht.

git commit --amend --author="Author Name <email@address.com>"

Als je echter meer dan één naam van de auteur wilt toewijzen, is het een beetje lastig. U moet een interactieve rebase starten en vervolgens commits als bewerking markeren, ze één voor één toewijzen en beëindigen.

Begin met rebasen met git rebase -i. Het zal je zoiets laten zien.

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

Verander de pick trefwoord voor edit voor de commits waarvoor je de naam van de auteur wilt wijzigen.

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

Sluit vervolgens de editor. Voor de beginners, klik Escape typ dan :wq en druk op Enter.

Dan zul je je terminal zien alsof er niets gebeurd is. Eigenlijk zit je midden in een interactieve rebase. Nu is het tijd om de auteursnaam van uw commit aan te passen met behulp van bovenstaande opdracht. Het opent de editor opnieuw. Stop en ga door met rebasen met git rebase --continue. Herhaal hetzelfde voor het commit-aantal dat u wilt bewerken. Je kunt ervoor zorgen dat de interactieve rebase is voltooid als je de No rebase in progress? bericht.


60
2017-08-29 00:52



  • Reset uw e-mail naar de config wereldwijd:

    git config --global user.email example@email.com

  • Stel nu de auteur van uw commit opnieuw in zonder de vereiste bewerking:

    git commit --amend --reset-author --no-edit


52
2018-04-05 12:44



De antwoorden in de vraag waaraan je hebt gelinkt, zijn goede antwoorden en dekken je situatie (de andere vraag is algemener omdat het gaat om het herschrijven van meerdere commits).

Als een excuus om uit te proberen git filter-branch, Ik heb een script geschreven om de auteursnaam en / of auteurmail voor een bepaalde 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 <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

46
2018-06-15 05:24



Wanneer het doen git rebase -i er is een interessant stukje in het document:

Als je twee of meer commits in één wilt folden, vervang dan de opdracht "pick" voor de tweede en volgende commits met "squash" of "fixup". Als de commits verschillende auteurs hadden, wordt de gevouwen commit toegeschreven aan de auteur van de eerste commit. Het voorgestelde commit-bericht voor de gevouwen commit is de aaneenschakeling van de commit-berichten van de eerste commit en van die met de "squash" commando, maar laat de commit berichten van commits weg met de "fixup" opdracht.

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

dan kan je 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 het rebase-doel
    • git commit --allow-empty -m "empty"
  • start de rebase-bewerking
    • git rebase -i B^
    • B^ selecteert de ouder van B.
  • je wilt een lege commit plaatsen voor elke commit om te wijzigen
  • je wilt veranderen pick naar squash voor die.

Voorbeeld van wat git rebase -i B^ zal je 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.


12
2017-08-28 01:03