Comment changer l'commettras auteur pour un engagement spécifique?
-
27-09-2019 - |
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.
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 ...
- Indiquez
git rebase -i B
( ici est un exemple de ce que vous verrez après l'exécution de la commandegit rebase -i B
)- si vous devez modifier
A
, utilisezgit rebase -i --root
- si vous devez modifier
- changer les lignes pour les deux
C
etD
depick
àedit
- Une fois que le rebasage a commencé, il faudrait d'abord faire une pause à
C
- Vous serait
git commit --amend --author="Author Name <email@address.com>"
- Alors
git rebase --continue
- Il faisait une pause à nouveau
D
- Ensuite, vous
git commit --amend --author="Author Name <email@address.com>"
à nouveau -
git rebase --continue
- Le rebasage compléterait.
- 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.
-
Commander commit que nous essayons de modifier.
git checkout 03f482d6
-
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
. -
Commander la branche d'origine.
-
Remplacez l'ancien commit avec le nouveau local.
git replace 03f482d6 42627abe
-
Réécrire tous les futurs commits basé sur le remplacement.
git filter-branch -- --all
-
Supprimer le remplacement de la propreté.
git replace -d 03f482d6
-
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 / ougit 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.
Modifier le mot-clé pick
à edit
pour les commits que vous souhaitez modifier le nom de l'auteur.
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:
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:
Par exemple, pour changer tout à partir de 4025621
:
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
etD
(= 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 deB
.
-
- 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.
Dans la poursuite de la réponse Eugen Konkov, à partir de la racine commit, utiliser l'indicateur de --root
. Le drapeau de --no-edit
est trop utile
git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
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é
- Premier type "journal git" pour obtenir le commettras id et plus de détails
-
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.
-
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
-
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>'
-
C'est, maintenant il suffit d'appuyer ESC,: wq et vous êtes tous ensemble
-
Alors git push origin HEAD: DIRECTION -f NOM [s'il vous plaît prendre soin de pousser -f Force]
comme
git push -f
ougit push origin HEAD: dev -f
-