Question Comment changer le nom de l'auteur et du committer et l'adresse e-mail de plusieurs validations dans Git?


J'écrivais un script simple dans l'ordinateur de l'école, et je confiais les changements à Git (dans un repo qui se trouvait dans mon pendrive, cloné de mon ordinateur à la maison). Après plusieurs commits, j'ai réalisé que je commettais des choses en tant qu'utilisateur root.

Y at-il un moyen de changer l'auteur de ces commits à mon nom?


1998
2018-04-15 03:09


origine


Réponses:


Changer l'auteur (ou le committer) nécessiterait de réécrire tout l'historique. Si vous êtes d'accord avec cela et pensez que ça vaut le coup alors vous devriez vérifier git filtre-branche. La page de manuel contient plusieurs exemples pour vous aider à démarrer. Notez également que vous pouvez utiliser les variables d'environnement pour changer le nom de l'auteur, du committer, des dates, etc. - voir la section "Variables d'environnement" du git man page.

Plus précisément, vous pouvez corriger tous les mauvais noms d'auteur et e-mails pour toutes les branches et étiquettes avec cette commande (source: GitHub aide):

#!/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

800
2018-04-15 03:16



Utilisation de la base de données interactive

Vous pourriez faire

git rebase -i -p <some HEAD before all of your bad commits>

Puis marquez tous vos mauvais commits comme "éditer" dans le fichier de rebasage. Si vous souhaitez également modifier votre première validation, vous devez l'ajouter manuellement en première ligne dans le fichier de rebasage (suivez le format des autres lignes). Ensuite, quand git vous demande de modifier chaque commit, faites

 git commit --amend --author "New Author Name <email@address.com>" 

modifier ou simplement fermer l'éditeur qui s'ouvre, puis faites

git rebase --continue

pour continuer le rebase.

Vous pouvez sauter l'ouverture de l'éditeur ici en ajoutant --no-edit pour que la commande soit:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

Commit unique

Comme l'ont noté certains commentateurs, si vous voulez simplement modifier la validation la plus récente, la commande rebase n'est pas nécessaire. Faites juste

 git commit --amend --author "New Author Name <email@address.com>"

Cela changera l'auteur au nom spécifié, mais le committer sera défini sur votre utilisateur configuré dans git config user.name et git config user.email. Si vous voulez définir le committer sur quelque chose que vous spécifiez, cela définira à la fois l'auteur et le committer:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

Remarque sur les validations de fusion

Il y avait une légère faille dans ma réponse originale. S'il y a des commits de fusion entre le courant HEAD et ton <some HEAD before all your bad commits>, puis git rebase les aplatira (et en passant, si vous utilisez les requêtes pull GitHub, il y aura une tonne de commits de fusion dans votre historique). Cela peut très souvent mener à une histoire très différente (car les changements en double peuvent être "rebasés"), et dans le pire des cas, cela peut conduire à git rebase vous demandant de résoudre les conflits de fusion difficiles (qui étaient probablement déjà résolus dans les commits de fusion). La solution est d'utiliser le -p drapeau à git rebase, qui préservera la structure de fusion de votre histoire. La page de manuel pour git rebase avertit que l'aide -p et -i peut conduire à des problèmes, mais dans le BUGS Il est dit dans la section "L'édition des validations et la reformulation de leurs messages de validation devraient fonctionner correctement".

J'ai ajouté -p à la commande ci-dessus. Dans le cas où vous modifiez simplement le commit le plus récent, ce n'est pas un problème.


1415
2017-08-24 03:08



Vous pouvez aussi faire:

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

Notez que si vous utilisez cette commande dans l'invite de commande Windows, vous devez utiliser "au lieu de ':

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD

565
2018-05-15 19:15



Un seul paquebot, mais faites attention si vous avez un dépôt multi-utilisateur - cela va changer tout s'engage à avoir le même (nouveau) auteur et committer.

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD

Avec des sauts de ligne dans la chaîne (ce qui est possible dans bash):

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='new@email'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='new@email'
  " HEAD

481
2018-04-15 03:22



Cela arrive quand vous n'avez pas initialisé $ HOME / .gitconfig. Vous pouvez corriger ceci comme:

git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author

testé avec git version 1.7.5.4


201
2018-02-16 09:46



Pour un seul commit:

git commit --amend --author="Author Name <email@address.com>"

(extrait de la réponse d'asmeurer)


179
2018-04-26 22:50



Dans le cas où seulement les quelques commits les plus importants ont de mauvais auteurs, vous pouvez tout faire à l'intérieur git rebase -i en utilisant le exec commande et le --amend commettre, comme suit:

git rebase -i HEAD~6 # as required

qui vous présente la liste modifiable des commits:

pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2

Puis ajouter exec ... --author="..." lignes après toutes les lignes avec de mauvais auteurs:

pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD

enregistrer et quitter l'éditeur (pour exécuter).

Cette solution peut être plus longue à taper que d'autres, mais elle est hautement contrôlable - je sais exactement ce qui la frappe.

Merci à @asmeurer pour l'inspiration.


150
2017-12-08 17:05



Github a un belle solution, qui est le script shell suivant:

#!/bin/sh

git filter-branch --env-filter '

an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"

if [ "$GIT_COMMITTER_EMAIL" = "your@email.to.match" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ]
then
    an="Your New Author Name"
    am="Your New Author Email"
fi

export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'

107
2017-10-07 09:54



Comme l'a mentionné Docgnome, réécrire l'histoire est dangereux et va briser les dépôts des autres.

Mais si vous voulez vraiment faire cela et que vous êtes dans un environnement bash (pas de problème sous Linux, sous Windows, vous pouvez utiliser git bash, fourni avec l'installation de git), utilisez git filtre-branche:

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL'

Pour accélérer les choses, vous pouvez spécifier une gamme de révisions que vous voulez réécrire:

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL' HEAD~20..HEAD

78
2017-08-04 00:52



Lorsque vous prenez en charge un commit non fusionné d'un autre auteur, il existe un moyen facile de gérer cela.

git commit --amend --reset-author


45
2018-03-23 22:23