Come modificare diversi commit in git per cambiare autore
-
12-11-2019 - |
Domanda
Ho fatto una serie di commit in GIT e ora mi rendo conto che ho dimenticato di impostare correttamente il nome utente e le proprietà e -mail dell'utente (nuova macchina). Non ho ancora spinto questi commit nel mio repository, quindi come posso correggere questi commit prima di farlo (solo gli ultimi commit sulla filiale principale)?
Ho guardato git reset
e git commit -C <id> --reset-author
, ma non credo di essere sulla buona strada.
Soluzione
Rebase/Emend sembra inefficiente, quando hai la potenza di Filter-Branch a portata di mano:
git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
GIT_AUTHOR_EMAIL=correct@email;
GIT_AUTHOR_NAME="Correct Name";
GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all
(diviso attraverso le linee per chiarezza, ma non necessarie)
Assicurati di ispezionare il risultato quando hai finito, per assicurarti di non cambiare nulla che non intendevi!
Altri suggerimenti
L'approccio interattivo Rebase è piuttosto bello se usato insieme a Exec. È possibile eseguire qualsiasi comando shell contro un commit specifico o tutti i commessi nella Rebase.
Prima imposta le impostazioni dell'autore GIT
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
Quindi per ripristinare l'autore per tutti i commit dopo il determinato sha
git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"
Questo spunterà il tuo editor per confermare le modifiche. Tutto quello che devi fare qui è salvare e smettere e esaminerà ogni commit ed eseguirà il comando specificato nel flag -x.
Per il commento di @Dave di seguito, puoi anche cambiare l'autore mantenendo i timestamp originali con:
git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
Per cambiare l'autore solo per l'ultimo commit:
git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
Supponiamo che tu voglia cambiare l'autore solo per gli ultimi n commissioni:
git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"
APPUNTI
- il
--no-edit
La bandiera assicura che ilgit commit --amend
non chiede una conferma extra - Quando usi
git rebase -i
, è possibile selezionare manualmente gli commit dove cambiare l'autore,
Il file che modifichi sembrerà così:
pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix
Credo che quello che stai cercando sia git rebase --interactive
Ti permette di andare a ripristinare un commit specifico e quindi andare a lanciare la cronologia cambiando l'aggiunta o il raggruppamento
Qui hai una spiegazione https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive
Questo Il metodo è stato documentato da GitHub proprio per questo scopo. I passaggi sono:
- Apri il terminale e crea un file spoglio clone del tuo repository
git clone --bare https://github.com/user/repo.git
cd repo
- Modifica il seguente script (Sostituzione
OLD_EMAIL
,CORRECT_EMAIL
, eCORRECT_NAME
)
#!/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
- Copia/incolla lo script nel tuo terminale e premi Invio per eseguirlo.
- Spingi le tue modifiche con
git push --force --tags origin 'refs/heads/*'
e hai finito!
Se ti senti pericoloso per il degrado e la modifica, potresti farlo in questo modo. Allo stesso tempo, imposteresti anche la configurazione globale che probabilmente intendevi fare comunque.
git reset HEAD~
(annulla l'ultimo commit)
git config --global user.name "Your Name"
git config --global user.email you@example.com
git commit -m "message"