2451 votes

Jetons un coup d'oeil sur un domaine particulier de Patrimoine canadien, celui des sports.

Je veux changer l'auteur d'un commit dans l'histoire. Ce n'est pas le dernier commit.

Je sais à propos de cette question - Comment puis-je changer l'auteur d'un commit dans git?

Mais je pense à propos de quelque chose, où je identifier les engager par hachage ou à court de hachage.

4133voto

Amber Points 159296

Rebase interactif hors d'un point plus tôt dans l'histoire de la validation, vous devez modifier (git rebase -i <earliercommit>). Dans la liste des commits être relocalisée, modifier le texte à partir d' pick de edit en regard de la valeur de hachage de celui que vous voulez modifier. Puis, quand git vous invite à modifier le commettre, utilisez ceci:

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

Par exemple, si votre commit l'histoire est - A-B-C-D-E-F avec F comme HEAD, et vous voulez changer l'auteur d' C et D, puis vous...

  1. Spécifier git rebase -i B
  2. changer le nombre de lignes pour les deux C et D de edit
  3. Une fois que cela a commencé, il faudrait d'abord faire une pause à C
  4. Vous serait - git commit --amend --author="Author Name <email@address.com>"
  5. Ensuite, git rebase --continue
  6. Il s'arrêtait de nouveau à l' D
  7. Ensuite, vous serait - git commit --amend --author="Author Name <email@address.com>" nouveau
  8. git rebase --continue
  9. Cela permettrait de compléter.

63voto

Chris Johnsen Points 50064

Les réponses à la question à laquelle vous avez accédé sont les bonnes réponses, et couvrir votre situation (l'autre question est plus générale puisqu'il s'agit de la réécriture de plusieurs commits).

Comme une excuse pour essayer git filter-branch, j'ai écrit un script pour réécrire le Nom de l'Auteur et/ou de l'Auteur par Courriel pour un commit:

#!/bin/sh

#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
#     If -f is supplied it is passed to "git filter-branch".
#
#     If <branch-to-rewrite> is not provided or is empty HEAD will be used.
#     Use "--all" or a space separated list (e.g. "master next") to rewrite
#     multiple branches.
#
#     If <new-name> (or <new-email>) is not provided or is empty, the normal
#     user.name (user.email) Git configuration value will be used.
#

force=''
if test "x$1" = "x-f"; then
    force='-f'
    shift
fi

die() {
    printf '%s\n' "$@"
    exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"

TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL

filt='

    if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
        if test -n "$TARG_EMAIL"; then
            GIT_AUTHOR_EMAIL="$TARG_EMAIL"
            export GIT_AUTHOR_EMAIL
        else
            unset GIT_AUTHOR_EMAIL
        fi
        if test -n "$TARG_NAME"; then
            GIT_AUTHOR_NAME="$TARG_NAME"
            export GIT_AUTHOR_NAME
        else
            unset GIT_AUTHOR_NAME
        fi
    fi

'

git filter-branch $force --env-filter "$filt" -- $br

19voto

Fabian76 Points 43

Un ajout à l'Ambre de la réponse (acceptée. Je ne peux pas commenter encore en raison d'un trop faible réputation, nouvel utilisateur, je suis donc en le mettant dans une réponse)
Il y a une étape supplémentaire si vous utilisez un référentiel centralisé.
Une étape supplémentaire est de:

git push -f pour forcer la mise à jour du référentiel central. Attention qu'il n'y a pas beaucoup de personnes qui travaillent sur la même branche, car il peut ruiner la cohérence.

17voto

dnozay Points 3672

Lorsque vous effectuez git rebase -i il y a ce morceau intéressant dans la doc:

Si vous voulez plier en deux, ou plus, s'engage dans une, remplacer la commande "pick" pour la deuxième et les suivantes s'engage avec "squash" ou "fixup". Si les commits avait différents auteurs, plié, commit sera attribué à l'auteur de la première validation. La suggestion de message de validation pour le plié commettre est la concaténation des messages de validation de la première engager et de ceux avec l' "squash" de commande, mais omet la validation des messages de commits avec l' "fixup" commande.

  • Si vous avez une histoire de l' A-B-C-D-E-F,
  • et que vous souhaitez modifier engage B et D (= 2 commits),

ensuite, vous pouvez faire:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • créer vide s'engage (un pour chaque commit):
    • vous avez besoin d'un message pour but rebase
    • git commit --allow-empty -m "empty"
  • démarrer le rebase opération
    • git rebase -i B^
    • B^ sélectionne le parent de l' B.
  • vous voulez mettre un vide s'engager avant chaque validation de modifier
  • vous voulez changer d' pick de squash pour ceux.

Exemple de ce que l' git rebase -i B^ vous donnera:

pick sha-commit-B some message
pick sha-commit-C some message
pick sha-commit-D some message
pick sha-commit-E some message
pick sha-commit-F some message
# pick sha-commit-empty1 empty
# pick sha-commit-empty2 empty

changement:

# change commit B's author
pick sha-commit-empty1 empty
squash sha-commit-B some message
# leave commit C alone
pick sha-commit-C some message
# change commit D's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message

Il vous invite à modifier les messages:

# This is a combination of 2 commits.
# The first commit's message is:

empty

# This is the 2nd commit message:

...some useful commit message there...

et vous pouvez simplement supprimer les premières lignes.

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