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?


2
Est-ce un reprositoire pour vous seul, pour quelques personnes ou pour un gros projet?
thejh



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 GIT_AUTHOR_EMAIL=hobo@example.com;
  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
        GIT_AUTHOR_EMAIL=john@example.com
    fi
    if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
    then
        GIT_COMMITTER_EMAIL=john@example.com
    fi
' -- --all

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 GIT_AUTHOR_EMAIL=authorEmail@example.com;\
export GIT_COMMITTER_NAME="Commmiter Name";\
export GIT_COMMITTER_EMAIL=commiterEmail@example.com;\
fi;\
git commit-tree "$@"'

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 GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'

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" "johnsmith@example.com"

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)


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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.