284 votes

Comment modifier plusieurs commits dans Git pour changer d'auteur ?

J'ai fait une série de commits dans Git et je réalise maintenant que j'ai oublié de définir correctement les propriétés de mon nom d'utilisateur et de mon email (nouvelle machine). Je n'ai pas encore poussé ces commits vers mon dépôt, alors comment puis-je corriger ces commits avant de le faire (seulement les 3 derniers commits sur la branche master) ?

J'ai regardé git reset y git commit -C <id> --reset-author mais je ne pense pas être sur la bonne voie.

2 votes

Une autre raison pour laquelle vous pourriez vouloir changer la propriété email est cette erreur github : remote: error: GH007: Your push would publish a private email address. ... ` ! [remote rejected] master -> master (push declined due to email privacy restrictions)`.

0 votes

322voto

Jefromi Points 127932

_Attention : maintenant déprécié en faveur de filtre-repo ._

Rebase/amendement semble inefficace, quand on a la puissance de la branche filtre à portée de main :

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

(divisé en plusieurs lignes pour plus de clarté, mais pas nécessaire)

N'oubliez pas d'inspecter le résultat lorsque vous avez terminé, afin de vous assurer que vous n'avez pas changé quelque chose que vous n'aviez pas prévu !

1 votes

Pourriez-vous expliquer un peu plus ? Je ne sais pas ce qu'est une branche de filtre.

1 votes

@maxpleaner git filter-branch --help est assez simple :)

3 votes

Voir aussi help.github.com/articles/changing-author-info qui ajoute également --tag-name-filter cat à la filter-branch afin de migrer les balises vers le nouvel historique. Il utilise également --branches --tags au lieu de --all qui ne réécrit que l'historique des branches et des étiquettes et laisse les autres branches et étiquettes intactes. refs seul (bien que cela ne fasse probablement pas une grande différence à moins que vous n'utilisiez, par exemple, l'option git-notes )

260voto

Alex Points 6968

L'approche interactive de rebase est assez intéressante lorsqu'elle est utilisée en conjonction avec exec. Vous pouvez exécuter n'importe quelle commande shell sur un commit spécifique ou sur tous les commits de la base de données.

Définissez d'abord vos paramètres d'auteur git

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

Ensuite, pour réinitialiser l'auteur pour tous les commits après le SHA donné

git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"

Cela fera apparaître votre éditeur pour confirmer les changements. Tout ce que vous devez faire ici est de sauvegarder et de quitter et il passera en revue chaque livraison et exécutera la commande spécifiée dans l'option -x.

Conformément au commentaire de @Dave ci-dessous, vous pouvez également changer l'auteur tout en conservant les horodatages originaux avec :

git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"

146voto

Chris Maes Points 1912

Pour changer l'auteur seulement pour le dernier commit :

git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit

Supposons que vous voulez seulement changer l'auteur pour les N derniers commits :

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

NOTES

  • le site --no-edit permet de s'assurer que les git commit --amend ne demande pas de confirmation supplémentaire
  • lorsque vous utilisez git rebase -i vous pouvez sélectionner manuellement les commits où changer l'auteur,

le fichier que vous modifiez ressemblera à ceci :

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

31voto

charsi Points 1058

La réponse la plus votée ici est maintenant périmée. Git affiche cet avertissement effrayant lors de l'utilisation de git filter-branch -.

WARNING: git-filter-branch has a glut of gotchas generating mangled history
         rewrites. Hit Ctrl-C before proceeding to abort, then use an
         alternative filtering tool such as 'git filter-repo'
         (https://github.com/newren/git-filter-repo/) instead.

filter-repo ne fait pas (encore) partie de git et doit être installé manuellement.

# Requires git v2.22+ and python v3.5+. Check with -
git --version && python3 --version

# Install using pip
pip install git-filter-repo    

Pour remplacer seulement l'email dans les commits précédents exécuter la commande comme ceci -

git filter-repo --email-callback '
    return email if email != b"incorrect@email" else b"correct@email"
' 

Pour remplacer les deux, e-mail et nom de l'auteur dans les commits précédents exécutez la commande comme ceci -

git filter-repo --commit-callback '
    if commit.author_email == b"incorrect@email":
        commit.author_email = b"correct@email" 
        commit.author_name = b"Correct Name"
        commit.committer_email = b"correct@email" 
        commit.committer_name = b"Correct Name"
' 

Assurez-vous que les retraits sont présents lorsque vous collez la commande dans votre terminal. Le callback utilise la syntaxe python, les indentations sont donc importantes.

Pour en savoir plus sur les callbacks de filter-repo, consultez la section docs .

12voto

user5783745 Points 1214

Cette méthode a été documentée par GitHub dans ce but précis (bien que GitHub l'ait supprimée depuis). Les étapes sont les suivantes :

  1. Ouvrez le terminal et faites un nu clone de votre dépôt

    git clone --bare https://github.com/user/repo.git cd repo

  2. Modifiez le script suivant (en remplaçant OLD_EMAIL , CORRECT_EMAIL y 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

  3. Copiez/collez le script dans votre terminal et appuyez sur entrée pour l'exécuter.

  4. Poussez vos modifications avec git push --force --tags origin 'refs/heads/*' et vous avez terminé !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X