Question

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

Je sais à cette question - Comment puis-je changer l'auteur d'une livraison en git?

Mais je pense à quelque chose, où je l'identifie par hachage ou commettras court hachage.

Était-ce utile?

La solution

Interactive rebasage au large d'un point plus tôt dans l'histoire que le vous engagerez-vous besoin de modifier (git rebase -i <earliercommit>). Dans la liste des commits étant rebasées, changer le texte de pick à edit à côté du hachage de celui que vous souhaitez modifier. Puis, quand git invites de changer le commettras, utilisez ceci:

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

Par exemple, si votre histoire est commettras A-B-C-D-E-F avec F comme HEAD, et que vous voulez changer l'auteur de C et D, alors vous ...

  1. Indiquez git rebase -i B ( ici est un exemple de ce que vous verrez après l'exécution de la commande git rebase -i B )
    • si vous devez modifier A, utilisez git rebase -i --root
  2. changer les lignes pour les deux C et D de pick à edit
  3. Une fois que le rebasage a commencé, il faudrait d'abord faire une pause à C
  4. Vous serait git commit --amend --author="Author Name <email@address.com>"
  5. Alors git rebase --continue
  6. Il faisait une pause à nouveau D
  7. Ensuite, vous git commit --amend --author="Author Name <email@address.com>" à nouveau
  8. git rebase --continue
  9. Le rebasage compléterait.
  10. Utilisez git push -f pour mettre à jour votre origine avec les commits mises à jour.

Autres conseils

Le réponse acceptée à cette question est une utilisation merveilleusement intelligente de rebasage interactif, mais il présente malheureusement des conflits si la commettras nous essayons de changer l'auteur de l'habitude d'être sur une branche qui a ensuite fusionné dans. de manière plus générale, il ne fonctionne pas lors de la manipulation des histoires en désordre.

Depuis que je suis inquiet sur l'exécution des scripts qui dépendent de réglage et variables d'environnement déréglage de réécrire l'histoire git, je suis en train d'écrire une nouvelle réponse basée sur cette post qui est similaire à cette réponse mais est plus complète.

Le suivant est testé et fonctionnel, contrairement à la réponse liée. Supposons que pour la clarté de l'exposition que 03f482d6 est le commettras dont l'auteur nous essayons de remplacer, et 42627abe est le commettras avec le nouvel auteur.

  1. Commander commit que nous essayons de modifier.

    git checkout 03f482d6
    
  2. Faire le changement de l'auteur.

    git commit --amend --author "New Author Name <New Author Email>"
    

    Maintenant, nous avons un nouveau commit avec hachage supposé être 42627abe.

  3. Commander la branche d'origine.

  4. Remplacez l'ancien commit avec le nouveau local.

    git replace 03f482d6 42627abe
    
  5. Réécrire tous les futurs commits basé sur le remplacement.

    git filter-branch -- --all
    
  6. Supprimer le remplacement de la propreté.

    git replace -d 03f482d6
    
  7. Appuyez sur la nouvelle histoire (utilisez uniquement --force en cas d'échec ci-dessous, et seulement après vérification de la santé mentale avec git log et / ou git diff).

    git push --force-with-lease
    

Au lieu de 4-6, vous pouvez simplement changer la base sur commettras nouveau:

git rebase -i 42627abe

documentation Github contient un script qui remplace l'info committers pour tous les commits dans une branche .

#!/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
  • Réinitialiser votre e-mail à la configuration globalement:

    git config --global user.email example@email.com

  • réinitialiser l'auteur de votre engagement sans modifier requis:

    git commit --amend --reset-author --no-edit

Vous pouvez modifier auteur de la dernière validation en utilisant la commande ci-dessous.

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

Cependant, si vous voulez changer plus d'un commits nom de l'auteur, il est un peu difficile. Vous devez commencer un rebasage interactif alors commits marque comme les modifier ammend puis un par un et la finition.

Démarrer rebasage avec git rebase -i. Il vous montrera quelque chose comme ça.

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

Modifier le mot-clé pick à edit pour les commits que vous souhaitez modifier le nom de l'auteur.

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

Ensuite, fermez l'éditeur. Pour les débutants, appuyez sur Escape puis tapez :wq et Enter hit.

Ensuite, vous verrez votre terminal tel que rien ne se passait. En fait, vous êtes au milieu d'un rebasage interactif. Maintenant, il est temps de modifier votre commettras son nom d'auteur en utilisant la commande ci-dessus. Il ouvrira à nouveau l'éditeur. Quitter et continuer rebasage avec git rebase --continue. Répétez la même chose pour le commettras auquel vous voulez modifier. Vous pouvez vous assurer que rebasage interactif terminé lorsque vous obtenez le message d'No rebase in progress?.

Les réponses à la question qui vous a de bonnes réponses et couvrent votre situation (l'autre question est plus générale puisqu'elle implique la réécriture plusieurs commits).

Comme une excuse pour essayer git filter-branch, j'ai écrit un script pour réécrire l'auteur Nom et / ou Auteur Email pour une livraison donnée:

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

Engagez avant:

 entrer image description ici

Pour résoudre auteur pour tous les commits vous pouvez appliquer la commande de @ réponse Amber:

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

Ou réutiliser votre nom et votre email, vous pouvez simplement écrire:

git commit --amend --author=Eugen

Valider après la commande:

 entrer image description ici

Par exemple, pour changer tout à partir de 4025621:

 entrer image description ici

Vous devez exécuter:

git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621

Remarque: Pour inclure un espace contenant l'auteur comme une adresse de nom et votre email, l'auteur doit être entouré par des guillemets échappées. Par exemple:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621

ou ajouter cet alias dans ~/.gitconfig:

[alias]
    reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --

Et puis exécutez:

git reauthor 4025621 Eugen

Il y a une étape supplémentaire réponse Amber si vous utilisez un référentiel centralisé:

git push -f pour forcer la mise à jour du répertoire central.

Attention qu'il n'y a pas beaucoup de gens qui travaillent sur la même branche, car il peut ruiner la cohérence.

Quand vous faites git rebase -i il y a ce bit intéressant dans le doc:

  

Si vous voulez plier deux ou plusieurs commits en un seul, remplacer la commande "pick" pour les commits deuxième et ultérieures avec "squash" ou "fixup". Si les commits avaient différents auteurs, plié commit sera attribué à l'auteur du premier engagement. Le message de validation suggéré pour le plié commit est la concaténation de la validation des messages du premier engagement et de ceux avec la commande "squash", mais passe sous silence les commits de commits avec la commande "fixup".

  • Si vous avez une histoire de A-B-C-D-E-F,
  • et que vous voulez le changement engage B et D (= 2 commits),

vous pouvez faire:

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

Exemple de ce 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.

Si ce que vous devez changer est l'auteur du dernier commit et aucun autre utilise votre dépôt, vous pouvez annuler votre dernier commit avec:

git push -f origin last_commit_hash:branch_name 

changer le nom de l'auteur de votre engagement avec:

git commit --amend --author "type new author here"

Quitter l'éditeur qui ouvre et appuyez à nouveau votre code:

git push

Il y a aussi une approche paresseuse à ce problème, surtout si vous avez plus d'un commettras que vous voulez changer. Dans mon cas, j'avais une nouvelle branche avec plusieurs commits avec un mauvais auteur, donc ce qui m'a aidé:

Accédez à votre branche d'origine:

git checkout develop

Créer une nouvelle branche de celui-ci:

git checkout -b myFeature develop 

Fusionner sans commettre d'info comme un commettras:

git merge --no-commit --squash branchWrongAuthor

Vous pouvez également les changements de scène:

git stage .

Modifier le nom de l'auteur et valider les modifications:

git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"

Et voilà, vous pouvez pousser les changements.

git push

Vous pouvez supprimer la branche avec un mauvais auteur après.

Si le commit que vous voulez changer est pas le dernier commit, puis suivez les étapes ci-dessous. Si votre livraison est dans une autre branche puis premier commutateur à cette branche.

git caisse branch_name

Trouver commit avant que la livraison que vous voulez changer et trouver son hachage. Ensuite commande problème de rebasage.

git rebase -i -p hachage de commettre

Ensuite, un éditeur ouvrira et entrez « modifier » pour les commits que vous souhaitez modifier. Laisser les autres avec l'option par défaut « choisir ». Une fois changé entrez « esc » clé et wq! à la sortie.

Ensuite, exécutez git commande COMMIT avec option de modification.

git commit --amend --author = "Nom d'utilisateur email" --no-edit

exécutez la commande suivante.

git rebase --continue

commit Une fois l'auteur est mis à jour dans le référentiel local, pousser les changements au référentiel distant.

Étapes pour renommer le nom de l'auteur après allouent poussé

  1. Premier type "journal git" pour obtenir le commettras id et plus de détails
  2. git rebase i HEAD ~ 10 (10 est le total engager à afficher sur rebasage)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip) If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. Ensuite, tapez "git rebase --continue" ou "git rebase --abort" selon vos besoins

    • maintenant votre volonté fenêtre rebasage ouvert, cliquez sur « i » du clavier
    • vous obtiendrez la liste des commits à 10 [parce que nous avons passé 10 commettras ci-dessus] Comme ci-dessous

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. Maintenant, vous devez ajouter ci-dessous commande juste au-dessous de vous engage à modifier, comme ci-dessous

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <author.name@mail.com>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>'

    1. C'est, maintenant il suffit d'appuyer ESC,: wq et vous êtes tous ensemble

    2. Alors git push origin HEAD: DIRECTION -f NOM [s'il vous plaît prendre soin de pousser -f Force]

    comme git push -f ou git push origin HEAD: dev -f

scroll top