Posso cambiare il mio nome e cognome in tutti i commit precedenti?


122

Vorrei cambiare il mio nome, cognome ed email in tutti i miei commit, è possibile?


2
È un archivio solo per te, per poche persone o per un grande progetto?
thejh



Risposte:


212

Usa git-filter-branch.

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ];
  then export GIT_AUTHOR_NAME="Hobo Bob"; export GIT_AUTHOR_EMAIL=hobo@example.com;
  fi; git commit-tree "$@"'

Ciò riguarda solo l'autore, non il committer (che per la maggior parte dei commit sarà lo stesso dell'autore). Se vuoi riscrivere anche quelli, imposta le variabili GIT_COMMITTER_NAMEe GIT_COMMITTER_EMAIL.

Si applica l' avvertenza standard sulla riscrittura della cronologia; fallo solo alla storia che non è stata ancora condivisa.

Aggiornamento di giugno 2018

Il manuale ora include una soluzione, utilizzando --env-filter, nei suoi esempi: https://git-scm.com/docs/git-filter-branch#_examples :

git filter-branch --env-filter '
    if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
    then
        GIT_AUTHOR_EMAIL=john@example.com
    fi
    if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
    then
        GIT_COMMITTER_EMAIL=john@example.com
    fi
' -- --all

4
Se stai usando msysgit, hai ancora accesso a bash. Altrimenti, non ho idea.
Josh Lee,

@ Joshua se stai usando qualcosa in cui non hai bash, potresti probabilmente usare lo scripting batch di Windows, anche se non l'ho provato.
MatrixFrog

e per quanto riguarda i tag? questa soluzione non cambierà l'autore dei tag
piotrek

@Joshua controlla il repository git su una scatola Linux ed esegui la correzione lì
Will Sheppard,

C'è un'opzione che si traduce in un nuovo ramo e lascia intatti i commit di origine?
Eugen Konkov

56

Per riscrivere sia l'autore che il commiter in tutti i commit selezionati:

git filter-branch --commit-filter \
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \
export GIT_AUTHOR_NAME="Author Name";\
export GIT_AUTHOR_EMAIL=authorEmail@example.com;\
export GIT_COMMITTER_NAME="Commmiter Name";\
export GIT_COMMITTER_EMAIL=commiterEmail@example.com;\
fi;\
git commit-tree "$@"'

1
Ma come applicare le modifiche al server remoto?
vikyd

5
@Viky Trygit push --all origin --force
user11153

2
Per me funziona ! Sto usando GitLab, devo rimuovere la protezione del ramo prima del comando push.
vikyd

37

Se non ci sono altri autori, puoi fare:

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'

1
Non sta riscrivendo le informazioni "Committer:".
user11153

1
Non ha lo scopo di riscrivere le informazioni del committer. Se vuoi farlo, esporta anche GIT_COMMITTER_NAME e GIT_COMMITTER_EMAIL (vedi risposta accettata).
chronospoon

12

Salvare lo script seguente come ad esempio ~/.bin/git-replace-authored eseguirlo utilizzando, ad esempio:

git replace-author "John Ssmith" "John Smith" "johnsmith@example.com"

Senza argomenti, aggiorna tutti i commit con il tuo nome per utilizzare il tuo indirizzo email corrente secondo Git config.

DEFAULT_NAME="$(git config user.name)"
DEFAULT_EMAIL="$(git config user.email)"
export OLD_NAME="${1:-$DEFAULT_NAME}"
export NEW_NAME="${2:-$DEFAULT_NAME}"
export NEW_EMAIL="${3:-$DEFAULT_EMAIL}"

echo "Old:" $OLD_NAME "<*>"
echo "New:" "$NEW_NAME <$NEW_EMAIL>"
echo "To undo, use: git reset $(git rev-parse HEAD)"

git filter-branch --env-filter \
'if [ "$GIT_AUTHOR_NAME" = "${OLD_NAME}" ]; then
    export GIT_AUTHOR_NAME="${NEW_NAME}"
    export GIT_AUTHOR_EMAIL="${NEW_EMAIL}"
    export GIT_COMMITTER_NAME="${NEW_NAME}"
    export GIT_COMMITTER_EMAIL="${NEW_EMAIL}"
fi'

Raw (da scaricare)


Come una breve nota: ~/.bin/ha bisogno di essere dentro gli utenti $PATHe le esigenze di file da file eseguibile, in modo da eseguire: chmod +x ~/.bin/git-replace-author.
Michael Gecht

E cosa fa con gli argomenti?
Eugen Konkov

2

Solo se non hai spinto i tuoi impegni nel mondo. Altrimenti, tutti gli altri hanno il tuo vecchio nome nel loro repo, il che è improbabile che tu possa cambiare quello di tutti.


Vero, ma in alcuni casi non hai scelta. Nel mio caso avevo un indirizzo email configurato nel mio git config (come ho potuto vedere con "git config --global -l"). Di conseguenza, non avevo alcuna attività di commit nel mio repository Github (perché l'indirizzo e-mail non corrispondeva a quello configurato in Github)! Per risolvere questo problema, ho corretto i miei commit locali usando la ricetta da stackoverflow.com/a/23564785/2474068 (funzionava perfettamente) e poi ho trasferito i commit modificati su Github usando "git push -u -f origin master" (con la forza flag "-f"). Questo va contro la pratica accettata, ma non avevo scelta!
leo

1
Sì, il punto era che qualsiasi fork di quel repo non avrebbe avuto quel cambiamento a meno che non accettasse il tuo force push. Sarebbe difficile aggiornare ogni fork :)
EnabrenTane

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.