Domanda Come modificare il nome dell'autore e del committente e l'e-mail di più commit in Git?


Stavo scrivendo una semplice sceneggiatura nel computer della scuola e ho commesso le modifiche a Git (in un repository che era nella mia chiavetta, clonato dal mio computer a casa). Dopo diversi commit mi sono reso conto che stavo commettendo cose come utente root.

C'è un modo per cambiare l'autore di questi commit al mio nome?


1998
2018-04-15 03:09


origine


risposte:


Cambiare l'autore (o il committer) richiederebbe riscrivere tutta la cronologia. Se stai bene con quello e pensi che ne valga la pena, allora dovresti dare un'occhiata git filter-branch. La pagina man include diversi esempi per iniziare. Si noti inoltre che è possibile utilizzare le variabili di ambiente per modificare il nome dell'autore, il committer, le date e così via. Vedere la sezione "Variabili d'ambiente" del git man page.

Nello specifico, puoi correggere tutti i nomi e le email degli autori sbagliati per tutti i rami e tag con questo comando (fonte: Aiuto GitHub):

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

800
2018-04-15 03:16



Utilizzo di Rebase interattivo

Potresti farlo

git rebase -i -p <some HEAD before all of your bad commits>

Quindi contrassegna tutti i tuoi cattivi commit come "modifica" nel file di rebase. Se si desidera modificare anche il primo commit, è necessario aggiungerlo manualmente come prima riga nel file di rebase (seguire il formato delle altre righe). Quindi, quando git ti chiede di modificare ogni commit, fallo

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

modificare o semplicemente chiudere l'editor che si apre, e poi fare

git rebase --continue

per continuare il rebase.

Puoi saltare completamente l'editor qui aggiungendolo --no-edit in modo che il comando sarà:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

Single Commit

Come alcuni dei commentatori hanno notato, se si desidera solo modificare il commit più recente, il comando rebase non è necessario. Basta fare

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

Ciò cambierà l'autore nel nome specificato, ma il committer verrà impostato sul tuo utente configurato git config user.name e git config user.email. Se vuoi impostare il committer su qualcosa che specifichi, questo imposterà sia l'autore che il committer:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

Nota su Merge Commits

C'era un leggero difetto nella mia risposta originale. Se ci sono commesse di unione tra la corrente HEAD e il tuo <some HEAD before all your bad commits>, poi git rebase li appiattirò (e, a proposito, se usi le richieste pull di GitHub, ci saranno un sacco di commit nella tua cronologia). Questo può molto spesso portare a una storia molto diversa (poiché le modifiche duplicate possono essere "ridefinite"), e nel peggiore dei casi, può portare a git rebase chiedendoti di risolvere i conflitti di fusione difficili (che erano probabilmente già risolti nell'unione di commit). La soluzione è usare il -p bandiera a git rebase, che manterrà la struttura di fusione della cronologia. La pagina di manuale per git rebase avverte che usando -p e -i può portare a problemi, ma nel BUGS sezione dice "La modifica commette e la riformulazione dei messaggi di commit dovrebbe funzionare correttamente."

ho aggiunto -p al comando precedente. Per il caso in cui stai solo cambiando il commit più recente, questo non è un problema.


1415
2017-08-24 03:08



Puoi anche fare:

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

Nota, se si utilizza questo comando nel prompt dei comandi di Windows, è necessario utilizzare "invece di ':

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD

565
2018-05-15 19:15



Un solo liner, ma fai attenzione se hai un repository multiutente - questo cambierà tutti si impegna ad avere lo stesso (nuovo) autore e committer.

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD

Con interruzioni di riga nella stringa (che è possibile in bash):

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='new@email'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='new@email'
  " HEAD

481
2018-04-15 03:22



Succede quando non hai un $ HOME / .gitconfig inizializzato. Puoi risolvere questo problema come:

git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author

testato con git versione 1.7.5.4


201
2018-02-16 09:46



Per un singolo commit:

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

(estratto dalla risposta di asmeurer)


179
2018-04-26 22:50



Nel caso in cui solo i migliori commit abbiano cattivi autori, puoi fare tutto questo all'interno git rebase -i usando il exec comando e il --amend impegnarsi, come segue:

git rebase -i HEAD~6 # as required

che ti presenta con l'elenco modificabile di commit:

pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2

Poi aggiungi exec ... --author="..." linee dopo tutte le righe con cattivi autori:

pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD

salva ed esci dall'editor (per eseguire).

Questa soluzione potrebbe essere più lunga da scrivere rispetto ad altri, ma è altamente controllabile - so esattamente cosa impegna.

Grazie a @asmeurer per l'ispirazione.


150
2017-12-08 17:05