336 votes

Comment modifier incorrect message de commit dans Mercurial?

Je suis actuellement en utilisant TortoiseHg (Mercurial) et accidentellement commis un mauvais message de commit. Comment dois-je aller sur la modification de ce message de commit dans le référentiel?

252voto

Thilo Points 108673

Mise à jour: Mercurial a ajouté --amend qui devrait être l'option préférée maintenant.


Vous pouvez annuler le dernier commit (mais seul le dernier) et le réappliquer.

Important: cela supprime définitivement le dernier commit (ou de traction). Donc, si vous avez fait hg update qui s'engagent ne sont plus dans votre répertoire de travail, puis il a disparu à jamais. Donc, faire une copie de la première.

Autre que cela, vous ne pouvez pas modifier le référentiel de l'histoire (y compris des messages de commit), parce que tout y est de vérifier la somme. La seule chose que vous pourriez faire est de tailler l'histoire après un ensemble de modifications, puis de le recréer en conséquence.

Rien de tout cela ne fonctionnera que si vous avez déjà publié votre modifications (à moins que vous pouvez vous procurer de toutes les copies), et vous aussi ne peut pas "réécrire l'histoire" qui incluent signé avec GPG s'engage (par d'autres personnes).

91voto

Antonio Beamud Points 1516

Eh bien, je l'habitude de faire de cette façon:

Imaginez, vous avez 500 s'engage, et votre erronée message de commit est dans r.498.

hg qimport -r 498:tip
hg qpop -a
joe .hg/patches/498.diff
(change the comment, after the mercurial header)
hg qpush -a
hg qdelete -r qbase:qtip

70voto

Codest Points 1306

bonne nouvelle: hg 2.1 juste ajouté git --modifier l'option http://mercurial.selenic.com/wiki/WhatsNew#Mercurial_2.2.1_.282012-05-03.29

et dans tortoiseHg, vous pouvez utiliser le bouton "Modifier révision en cours" en sélectionnant la flèche noire à droite du bouton de validation

a

49voto

Curious2learn Points 3607

Je sais que c'est un vieux post et vous avez marqué la question répondu. Je cherchais la même chose récemment et j'ai trouvé l' histedit extension très utile. Le processus est expliqué ici:

http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html

20voto

maxschlepzig Points 3578

Dernière opération a été le commit en question

Pour modifier le message de validation de la dernière validation lors de la dernière mercurial opération a été un commit, vous pouvez utiliser

$ hg rollback

pour annuler le dernier commit et ré-engager avec le nouveau message:

$ hg ci -m 'new message'

Mais être prudent, car la commande rollback aussi restaure les opérations suivantes:

  • l'importation
    • pull
    • push (avec ce référentiel que la destination)
    • dégrouper

(voir hg help rollback)

Ainsi, si vous n'êtes pas sûr si le dernier mercurial commande a été un hg ci, ne pas utiliser hg rollback.

Changement de tout autre message de commit

Vous pouvez utiliser la mq extension, qui est distribué avec Mercurial, pour modifier le message de validation de s'engager.

Cette approche n'est utile que quand il ne sont pas déjà cloné des dépôts dans le public, qui contiennent l'ensemble de modifications que vous souhaitez renommer, car cela modifie la révision de hachage, et tout ce que la suite des révisions.

Cela signifie que vous devez être en mesure de supprimer tous les clones qui comprennent l'ensemble de modifications que vous souhaitez renommer. D'autre poussant/tirant entre eux ne fonctionne pas.

L'utilisation de la mq extension vous activer explicitement, par exemple, sous UNIX vérifier votre ~/.hgrc, qui doit contenir les lignes suivantes:

[extensions]
mq=

Dire que vous voulez changer de révision de la X - premier qimport des importations révisions X et suivantes. Maintenant qu'ils sont enregistrés comme une pile d'application de correctifs. Popping (qpop) de la pile complète sauf X X disponibles pour des changements via qrefresh. Après le message de commit est changé, vous avez qu'à appuyer sur tous les correctifs de nouveau (qpop) de ré-appliquer, c'est à dire à recréer les révisions suivantes. La pile de patchs n'est pas nécessaire, il peut donc être supprimé via qfinish.

La démo suivante script affiche toutes les opérations dans l'action. Dans l'exemple, le message de validation de la troisième révision est renommé.

# test.sh
set -x -e -u
echo INFO: Delete old stuff
rm -rf .hg `seq 5`
echo INFO: Setup repository with 5 revisions
hg init
echo '[ui]' > .hg/hgrc
echo 'username=Joe User <juser@example.org>' >> .hg/hgrc
echo 'style = compact' >> .hg/hgrc
for i in `seq 5`; do
  touch $i && hg add $i && hg ci -m "changeset message $i" $i
done
hg log 
echo INFO: Need to rename the commit message or the 3rd revision
echo INFO: Displays all patches
hg qseries
echo INFO: Import all revisions including the 3rd to the last one as patches
hg qimport -r 2:tip
hg qseries
echo INFO: Pop patches
hg qpop 2.diff
hg qseries
hg log 
hg parent
hg qrefresh -m 'CHANGED MESSAGE'
hg log 
echo INFO: Push all remaining patches
hg qpush -a
hg log 
hg qseries
echo INFO: Remove all patches
hg qfinish -a
hg qseries && hg log && hg parent

Le copier dans un répertoire vide un de l'exécuter, par exemple via:

$ bash test.sh 2>&1 | tee log

Le résultat devrait inclure à l'origine de la révision du message:

+ hg log
[..]
2   53bc13f21b04   2011-08-31 17:26 +0200   juser
  changeset message 3

Et l'opération de changement de nom a changé message:

+ hg log
[..]
2   3ff8a832d057   2011-08-31 17:26 +0200   juser
  CHANGED MESSAGE

(Testé avec Mercurial 1.7.5)

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