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.

È stato utile?

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 il git 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:

  1. Apri il terminale e crea un file spoglio clone del tuo repository
git clone --bare https://github.com/user/repo.git
cd repo
  1. Modifica il seguente script (Sostituzione OLD_EMAIL, CORRECT_EMAIL, e CORRECT_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
  1. Copia/incolla lo script nel tuo terminale e premi Invio per eseguirlo.
  2. 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"

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