web-dev-qa-db-fra.com

Comment modifier plusieurs commits dans Git pour changer d'auteur

J'ai effectué une série de commits dans Git et je réalise maintenant que j'ai oublié de définir correctement mon nom d'utilisateur et les propriétés de messagerie de l'utilisateur (nouvelle machine). Je n'ai pas encore transféré ces commits vers mon référentiel. Comment puis-je alors les corriger avant de le faire (seuls les 3 derniers commits sur la branche principale)?

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

127
pauldoo

Rebaser/modifier semble inefficace, lorsque vous avez le pouvoir de 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

(découpé sur plusieurs lignes pour plus de clarté, mais pas nécessaire)

Assurez-vous d'inspecter le résultat lorsque vous avez terminé, pour vous assurer de ne rien changer de ce que vous ne vouliez pas faire!

162
Cascabel

L’approche de rebase interactive est très jolie quand elle est utilisée avec exec. Vous pouvez exécuter n’importe quelle commande Shell sur un commit spécifique ou sur tous les commits de la base.

Commencez par définir vos paramètres d'auteur git

git config --global user.name "John Doe"
git config --global user.email [email protected]

Puis 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 modifications. Tout ce que vous avez à faire ici est de sauvegarder et de quitter. Il passera par chaque commit et exécutera la commande spécifiée dans l’option -x.

Selon le commentaire de @ Dave ci-dessous, vous pouvez également modifier l'auteur tout en conservant les horodatages d'origine avec:

git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <[email protected]>' -CHEAD"
102
Alex

Pour changer l'auteur uniquement pour le dernier commit:

git commit --amend --author 'Author Name <[email protected]>' --no-edit

Supposons que vous souhaitiez uniquement modifier l'auteur pour les N derniers commits:

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <[email protected]>' --no-edit"

REMARQUES 

  • l'indicateur --no-edit s'assure que le 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 d’auteur, 

le fichier que vous éditez ressemblera à ceci:

pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit
pick dc18f70 bugfix
53
Chris Maes

Je crois que ce que vous cherchez, c'est git rebase --interactive

Il vous permet de réinitialiser un commit spécifique, puis de jeter l'historique en changeant l'ajout ou le groupement de commits.

Ici vous avez une explication https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git -rebase-interactive

3
Fernando Diaz Garrido

Si vous ne vous sentez pas en sécurité à propos de la dégradation et des modifications, vous pouvez le faire de cette façon. En même temps, vous définissez également la configuration globale, ce que vous vouliez probablement faire de toute façon. 

git reset HEAD~ (annule le dernier commit)

git config --global user.name "Your Name"

git config --global user.email [email protected]

git commit -m "message"

0
tymac

Cette méthode a été documentée par github dans ce but précis. Les étapes sont les suivantes:

  1. Ouvrez le terminal et faites un clone nu de votre repo 
git clone --bare https://github.com/user/repo.git
cd repo
  1. Editez le script suivant (en remplaçant OLD_EMAIL, CORRECT_EMAIL et CORRECT_NAME)
#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
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. Copiez/collez le script dans votre terminal et appuyez sur Entrée pour l'exécuter. 
  2. Poussez vos modifications avec git Push --force --tags Origin 'refs/heads/*' et vous avez terminé!
0
user5783745