Puis-je changer mon nom et mon prénom dans tous les commits précédents?

122

Je souhaite changer mon nom, prénom et email dans tous mes engagements, est-ce possible?

Joshua
la source
2
Est-ce un reprositoire pour vous seul, pour quelques personnes ou pour un gros projet?
thejh
3
duplicata possible de Comment changer l'auteur d'un commit dans git?
Josh Lee
Copie possible de Modifier le nom de l'auteur et du
validateur

Réponses:

212

Utilisez git-filter-branch.

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ];
  then export GIT_AUTHOR_NAME="Hobo Bob"; export [email protected];
  fi; git commit-tree "$@"'

Cela n'affecte que l'auteur, pas le committer (qui pour la plupart des commits sera le même que l'auteur). Si vous souhaitez les réécrire également, définissez les variables GIT_COMMITTER_NAMEet GIT_COMMITTER_EMAIL.

L' avertissement standard sur la réécriture de l'historique s'applique; faites-le seulement à l'histoire qui n'a pas encore été partagée.

Mise à jour de juin 2018

Le manuel inclut désormais une solution, en utilisant --env-filter, dans ses exemples: https://git-scm.com/docs/git-filter-branch#_examples :

git filter-branch --env-filter '
    if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
    then
        [email protected]
    fi
    if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
    then
        [email protected]
    fi
' -- --all
Josh Lee
la source
4
Si vous utilisez msysgit, vous avez toujours accès à bash. Sinon, je n'ai aucune idée.
Josh Lee
@Joshua si vous utilisez quelque chose où vous n'avez pas bash, vous pourriez probablement utiliser le script batch Windows, même si je ne l'ai pas essayé.
MatrixFrog
et qu'en est-il des tags? cette solution ne changera pas l'auteur des tags
piotrek
@Joshua vérifie le repo git sur une boîte Linux et y effectue le correctif
Will Sheppard
Existe-t-il une option qui aboutit à une nouvelle branche et laisse les commits source intacts?
Eugen Konkov
56

Pour réécrire à la fois l'auteur et le validateur dans tous les commits sélectionnés:

git filter-branch --commit-filter \
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \
export GIT_AUTHOR_NAME="Author Name";\
export [email protected];\
export GIT_COMMITTER_NAME="Commmiter Name";\
export [email protected];\
fi;\
git commit-tree "$@"'
user11153
la source
1
Mais comment appliquer les modifications au serveur distant?
vikyd
5
@Viky Trygit push --all origin --force
user11153
2
Ça marche pour moi ! J'utilise GitLab, je dois déprotéger la branche avant la commande push.
vikyd
37

S'il n'y a pas d'autres auteurs, vous pouvez faire:

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export [email protected]; git commit-tree "$@"'
denis.peplin
la source
1
Il ne s'agit pas de réécrire les informations "Committer:".
user11153
1
Il n'est pas destiné à réécrire les informations du commetteur. Si vous souhaitez faire cela, exportez également GIT_COMMITTER_NAME et GIT_COMMITTER_EMAIL (voir la réponse acceptée).
chronospoon
12

Enregistrez le script ci-dessous comme par exemple ~/.bin/git-replace-authoret exécutez-le en utilisant, par exemple:

git replace-author "John Ssmith" "John Smith" "[email protected]"

Sans argument, il met à jour tous les commits avec votre nom pour utiliser votre adresse e-mail actuelle selon la configuration de Git.

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 (à télécharger)

Zaz
la source
Comme une courte note: ~/.bin/doit être à l' intérieur des utilisateurs $PATHet les besoins de fichiers à exécutable, donc exécuter: chmod +x ~/.bin/git-replace-author.
Michael Gecht
Et que fait-il avec les arguments?
Eugen Konkov
2

Seulement si vous n'avez pas poussé vos engagements dans le monde. Sinon, tout le monde a votre ancien nom dans son repo, ce qui est peu probable que vous puissiez changer celui de tout le monde.

EnabrenTane
la source
C'est vrai, mais dans certains cas, vous n'avez pas le choix. Dans mon cas, j'avais une mauvaise adresse e-mail configurée dans ma configuration git (comme j'ai pu le voir avec "git config --global -l"). En conséquence, aucune activité de validation n'apparaissait dans mon propre dépôt Github (car l'adresse e-mail ne correspondait pas à l'e-mail configuré dans Github)! Pour résoudre ce problème, j'ai corrigé mes commits locaux en utilisant la recette de stackoverflow.com/a/23564785/2474068 (a fonctionné parfaitement), puis j'ai poussé les commits modifiés vers Github en utilisant "git push -u -f origin master" (avec la force drapeau "-f"). Cela va à l'encontre des pratiques acceptées mais je n'avais pas le choix!
leo
1
Oui, mon point était que les fourchettes de ce repo n'auraient pas ce changement à moins qu'elles n'acceptent votre poussée de force. Il serait difficile de mettre à jour chaque fork :)
EnabrenTane
1

Avec Git 2.24 (Q4 2019), git filter-branch(et BFG) est obsolète .

L'équivalent serait, using newren/git-filter-repo, et sa section d'exemple :

cd repo
git filter-repo --mailmap my-mailmap

avec my-mailmap:

Correct Name <[email protected]> <[email protected]>

Cela remplacerait le nom de l'auteur et l'adresse e-mail de tout commit effectué par quiconque avec <[email protected]>

Voir la git shortlogsection auteur du mappage pour la syntaxe exacte de

VonC
la source