Domanda

voglio cambiare l'autore di uno specifico impegno nella storia. Non è l'ultimo commit.

So che su questa questione - Come faccio a cambiare l'autore di un commit in Git?

Ma io sto pensando a qualcosa, in cui mi identifico il commit da hash o di breve hash.

È stato utile?

Soluzione

Interactive rebase fuori di un punto in precedenza nella storia che il commit è necessario modificare (git rebase -i <earliercommit>). Nella lista dei commit essere calcolato su base, modificare il testo da pick a edit accanto al hash di quello che si desidera modificare. Poi, quando richieste git di cambiare il commit, utilizzare questo:

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

Per esempio, se il commit storia è A-B-C-D-E-F con F come HEAD, e si desidera modificare l'autore di C e D, allora si farebbe ...

  1. Specifica git rebase -i B ( qui è un esempio di ciò che si vedrà dopo l'esecuzione del comando git rebase -i B )
    • se è necessario modificare A, uso git rebase -i --root
  2. modificare le linee sia per C e D da pick a edit
  3. Una volta che il rebase iniziato, sarebbe prima pausa a C
  4. Lo faresti git commit --amend --author="Author Name <email@address.com>"
  5. Poi git rebase --continue
  6. Si fermava di nuovo a D
  7. Poi si sarebbe git commit --amend --author="Author Name <email@address.com>" nuovo
  8. git rebase --continue
  9. Il rebase completerebbe.
  10. Usa git push -f per aggiornare la vostra origine con i commit aggiornati.

Altri suggerimenti

Il accettato risposta a questa domanda è un uso straordinariamente intelligente di rebase interattivo, ma presenta purtroppo conflitti se il commit stiamo cercando di cambiare l'autore usato per essere su un ramo che è stata successivamente incorporata in. Più in generale, non funziona durante la manipolazione di storie disordinato.

Dato che io sono preoccupato di eseguire gli script che dipendono da variabili di impostazione e ambiente disinserimento di riscrivere la storia git, sto scrivendo una nuova risposta basata su questo post che è simile a questa risposta ma è più completa.

Di seguito è testato e funzionante, a differenza della risposta legata. Assumere per chiarezza di esposizione che 03f482d6 è il commit il cui autore che stiamo cercando di sostituire, e 42627abe è il commit con il nuovo autore.

  1. Controlla il commit che stiamo cercando di modificare.

    git checkout 03f482d6
    
  2. Fare il cambiamento autore.

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

    Ora abbiamo un nuovo commit con hash presume essere 42627abe.

  3. Controlla il ramo originale.

  4. Sostituire il vecchio commit con il nuovo locale.

    git replace 03f482d6 42627abe
    
  5. Riscrivere tutti i commit futuri basati sulla sostituzione.

    git filter-branch -- --all
    
  6. Rimuovi la sostituzione per la pulizia.

    git replace -d 03f482d6
    
  7. Spingere la nuova storia (utilizzare solo se il force sotto fallisce, e solo dopo aver verificato la sanità mentale con git log e / o git diff).

    git push --force-with-lease
    

Invece di 4-6 si può solo rebase sul nuovo commit:

git rebase -i 42627abe

uno script che sostituisce informazioni committer per tutti i commit in un ramo .

#!/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
  • Cambia la tua e-mail per la configurazione a livello globale:

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

  • Ora azzerare l'autore del vostro impegno senza la revisione richiesta:

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

È possibile modificare autore dell'ultimo commit con il comando di seguito.

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

Tuttavia, se si desidera modificare più di un commit nome dell'autore, è un po 'complicato. È necessario avviare un rebase interattivo poi commit Segna come modificare poi ammend uno per uno e la finitura.

Inizia rebasing con git rebase -i. Essa vi mostrerà qualcosa di simile.

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

Cambia la parola chiave per pick edit per i commit che si desidera modificare il nome dell'autore.

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

Quindi chiudere l'editor. Per i principianti, colpo Escape quindi digitare :wq e colpo Enter.

Di seguito ci sarà il terminale come se niente fosse. In realtà ci si trova nel bel mezzo di un rebase interattivo. Ora è il momento di modificare la vostra commettere del nome dell'autore utilizzando il comando di cui sopra. Si aprirà l'editor di nuovo. Uscire e continuare rebase con git rebase --continue. Ripetere lo stesso per il commit contare che si desidera modificare. Si può fare in modo che rebase interattivo finito quando si riceve il messaggio No rebase in progress?.

Le risposte della domanda a cui si è collegato sono buone risposte e coprire la situazione (l'altra domanda è più generale in quanto si tratta di riscrittura più commit).

come una scusa per provare git filter-branch, ho scritto uno script per riscrivere il nome dell'autore e / o autore e-mail per un dato commit:

#!/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

Commit prima:

 entrare descrizione dell'immagine qui

Per risolvere autore per tutti i commit è possibile applicare il comando da @ risposta di Ambra:

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

o per riutilizzare il vostro nome e indirizzo email si può semplicemente scrivere:

git commit --amend --author=Eugen

Commit dopo il comando:

 entrare descrizione dell'immagine qui

Per esempio, per cambiare tutti a partire dalla 4025621:

 entrare descrizione dell'immagine qui

È necessario eseguire:

git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621

Nota: Per includere un autore che contiene spazi come un nome e indirizzo email, l'autore deve essere racchiuso tra virgolette escape. Ad esempio:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621

o aggiungere questo alias in ~/.gitconfig:

[alias]
    reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --

e quindi eseguire:

git reauthor 4025621 Eugen

C'è un ulteriore passaggio per di Ambra risposta se si sta utilizzando un archivio centralizzato:

git push -f per forzare l'aggiornamento del repository centrale.

Fare attenzione che non ci sono un sacco di persone che lavorano sullo stesso ramo perché può rovinare la coerenza.

Nel fare git rebase -i c'è questo pezzo interessante nel doc:

  

Se si vuole piegare due o più commit in una sola, sostituire il comando "pick" per la seconda e le successive impegna con "squash" o "fixup". Se i commit avevano diversi autori, il piegato commit sarà attribuito all'autore del primo commit. Il messaggio suggerito impegnarsi per il piegato commit è la concatenazione dei messaggi di commit del primo commit e di coloro che con il comando "squash", ma omette i messaggi di commit di commit con il comando "fixup".

  • Se avete una storia di A-B-C-D-E-F,
  • e si desidera cambiare impegna B e D (= 2 commit),

allora si può fare:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • creare commit vuoti (uno per ogni commit):
    • è necessario un messaggio a scopo rebase
    • git commit --allow-empty -m "empty"
  • avviare l'operazione rebase
    • git rebase -i B^
    • Seleziona B^ il genitore di B.
  • si vorrà mettere uno vuoto commettere prima ogni commit di modificare
  • si desidera modificare pick a squash per quelli.

Esempio di ciò che git rebase -i B^ vi darà:

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

cambiamento che a:

# 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

E vi verrà chiesto di modificare i messaggi:

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

e si può solo rimuovere le prime righe.

Per conseguire la risposta Eugen Konkov , a partire dalla radice commit, bandiera uso --root. La bandiera --no-edit è utile anche

git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"

Se avete bisogno di cambiamento è l'autore dell'ultimo commit e nessun altro sta usando il repository, è possibile annullare l'ultima impegnarsi con:

git push -f origin last_commit_hash:branch_name 

cambiare il nome dell'autore del commit con:

git commit --amend --author "type new author here"

Si fa terminare l'editor che si apre e spingere di nuovo il codice:

git push

C'è anche un approccio pigro per questo problema, soprattutto se si dispone di più di un commit che si desidera modificare. Nel mio caso, ho avuto un nuovo ramo con diversi commit con un autore sbagliato, così che cosa mi ha aiutato:

Vai alla vostra filiale originale:

git checkout develop

Crea nuovo ramo da esso:

git checkout -b myFeature develop 

Unisci senza commettere informazioni come un commit:

git merge --no-commit --squash branchWrongAuthor

Si potrebbe anche voler cambiamenti di scena:

git stage .

Cambia il nome dell'autore e il commit delle modifiche:

git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"

E questo è tutto, si può spingere le modifiche.

git push

È possibile eliminare il ramo con un autore sbagliato dopo che.

Se il commit che si desidera il cambiamento non è l'ultimo commit, quindi seguire la procedura di seguito. Se il commit è in diverso ramo poi primo switch a quel ramo.

git checkout NOME_RAMO

Trova commit prima del commit che si desidera cambiare e trovare il suo hash. Poi il comando rebase problema.

git rebase -i -p hash del commit

Poi un editor si aprirà ed entrare 'modifica' per i commit che si desidera modificare. Lascia gli altri con default 'Pick' opzione. Una volta inserite chiave e WQ cambiato 'esc'! per uscire.

Poi emettere git commit comando opzione modifica con.

git commit --amend --author = "Nome utente e-mail" --no-modifica

quindi eseguire il seguente comando.

git rebase --continue

Una volta che commettono autore viene aggiornato nel repository locale, spingere le modifiche al repository remoto.

I passaggi per rinominare il nome dell'autore dopo commit spinto

  1. Primo tipo "git log" per ottenere il commit id e maggiori informazioni
  2. git rebase i HEAD ~ 10 (10 è il totale impegnano a visualizzare sul rebase)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip) If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. Quindi digitare "git rebase --continue" o "git rebase --abort" secondo il vostro bisogno

    • ora la vostra finestra rebase volontà aperta, fare clic su "i" chiave da tastiera
    • quindi si otterrà elenco di commit a 10 [perché siamo passati 10 commettere sopra] Come seguente

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. Ora è necessario aggiungere sotto il comando appena al di sotto del commit che si desidera modificare, come qui di seguito

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <author.name@mail.com>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>'

    1. Questo è tutto, ora basta premere ESC,: wq e voi siete tutti insieme

    2. Poi origine git push TESTA: NOME DELLA BANCA -f [si prega di prendersi cura di -f forza di spinta]

    come git push -f o git push origin HEAD: dev -f

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top