Comment modifier un message de propagation incorrect dans Mercurial? [dupliquer]

cette question a déjà une réponse ici:

j'utilise actuellement TortoiseHg (Mercurial) et j'ai accidentellement commis un message de propagation incorrect. Comment éditer ce message de propagation dans le dépôt?

325
demandé sur Gangnus 2009-03-08 07:42:39

12 réponses

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


vous pouvez faire reculer le dernier commit (mais seulement le dernier) avec hg rollback et ensuite l'appliquer de nouveau.

Important : ce supprime définitivement la dernière commit (ou pull). Donc si vous avez fait un hg update que commit n'est pas plus dans votre répertoire de travail, puis il a disparu à jamais. alors faites une copie d'abord.

à part cela, vous ne pouvez pas changer l'historique du dépôt (y compris les messages de propagation), parce que tout ce qui s'y trouve est coché-additionné. La seule chose que vous pouvez faire est de tailler l'histoire après un ensemble de changements donnés, et puis de la recréer en conséquence.

rien de tout cela ne fonctionnera si vous avez déjà publié vos modifications (à moins que vous ne puissiez obtenir toutes les copies), et vous ne pouvez pas non plus" réécrire l'histoire " qui inclut les commits signés GPG (par d'autres personnes).

238
répondu Thilo 2017-05-23 11:46:54

Eh bien, je faisais comme ça:

imaginez, vous avez 500 commits, et votre message de commit erroné est en R. 38.

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
90
répondu Antonio Beamud 2011-03-06 21:25:39

bonne nouvelle: HG 2.2 vient d'ajouter git like --amend option.

et dans tortoiseHg, vous pouvez utiliser "Modifier la révision en cours" en sélectionnant flèche noire sur le bouton droit de commit

a

59
répondu prime23 2017-05-31 11:33:28

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'extension histedit très utile. Le processus est expliqué ici:

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

44
répondu Curious2learn 2011-01-01 15:30:32

la dernière opération a été la Commission en question

pour changer le message de propagation du dernier commit lorsque la dernière opération mercuriale était 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 soyez prudent car la commande rollback renvoie aussi les opérations suivantes:

  • importation
    • pull
    • push (avec ce dépôt comme destination)
    • dégrouper

(voir hg help rollback )

ainsi, si vous n'êtes pas sûr si la dernière commande mercurielle était un hg ci , n'utilisez pas hg rollback .

modifier tout autre message de propagation

vous pouvez utiliser le mq extension , qui est distribué avec Mercurial, pour changer le message de commit de n'importe quel commit.

cette approche n'est utile que lorsqu'il n'y a pas déjà de dépôts clonés dans le public qui contiennent les changeset que vous voulez renommer parce que cela modifie le hachage des changeset de celui-ci et tous les changesets suivants.

cela signifie que vous devez être en mesure de supprimer tous les clones existants qui comprennent les changements que vous vous voulez renommer, ou bien pousser / tirer entre eux ne fonctionnerait pas.

pour utiliser l'extension mq vous devez l'activer explicitement, par exemple sous UNIX, cochez votre ~/.hgrc , qui doit contenir les lignes suivantes:

[extensions]
mq=

dire que vous voulez modifier la révision X - premier qimport importations révisions X et suivantes. Maintenant ils sont enregistrés comme une pile de correctifs appliqués. Popping ( qpop ) la pile complète sauf X fait X disponible pour des modifications via qrefresh . Une fois que le message de propagation a été modifié, vous devez à nouveau appuyer sur tous les correctifs ( qpop ) pour les appliquer de nouveau, c'est-à-dire pour recréer les révisions suivantes. La pile de patches n'est pas nécessaire, elle peut donc être retirée via qfinish .

suit script de démonstration montre toutes les opérations en action. Dans l'exemple, le message de propagation du troisième ensemble de modifications 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

Copiez-le dans un répertoire vide l'exécuter par exemple via:

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

la sortie doit inclure le message original changeset:

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

et l'opération de changement de nom le message changé:

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

(Testé avec Mercurial 1.7.5)

20
répondu maxschlepzig 2017-02-21 21:13:30

dans TortoiseHg, faites un clic droit sur la révision que vous souhaitez modifier. Choisir Modifier L'historique - > importer MQ. Cela convertira toutes les révisions jusqu'à et y compris la révision sélectionnée à partir de Mercurial changesets en Mercurial queue patches. Sélectionnez le Patch pour lequel vous souhaitez modifier le message, et il devrait changer automatiquement l'écran à l'éditeur MQ. Modifiez le message qui se trouve au milieu de l'écran, puis cliquez sur QRefresh. Enfin, un clic droit sur le patch et choisissez Modifier Histoire - > terminer le Patch, qui le convertira de nouveau d'un patch dans un ensemble de changement.

Oh, cela suppose que MQ est une extension active pour TortoiseHG sur ce dépôt. Si ce n'est pas le cas, vous devriez pouvoir cliquer sur Fichier->Paramètres, cliquer sur Extensions et cliquer sur la case à cocher mq. Il devrait vous avertir que vous devez fermer TortoiseHg avant que l'extension est active, donc fermer et rouvrir.

17
répondu knockNrod 2012-08-16 19:38:34

comme d'autres l'ont mentionné, L'extension MQ est beaucoup plus adaptée à cette tâche, et vous ne courez pas le risque de détruire votre travail. Pour ce faire:

  1. activez L'extension MQ, en ajoutant quelque chose comme ça à votre hgrc:
    [extensions]
    mq =
    
  2. mise à jour du jeu de modifications que vous souhaitez éditer, généralement conseil:
    hg up <rev>
    
  3. importer les modifications actuelles dans la file d'attente:
    hg qimport -r .
    
  4. rafraîchir le patch, et éditer le message de propagation:
    hg qrefresh -e
    
  5. terminer tous les correctifs appliqués (un, dans ce cas) et les stocker comme des changements réguliers:
    hg qfinish -a
    

Je ne suis pas familier avec TortoiseHg, mais les commandes devraient être similaires à celles ci-dessus. Je pense également qu'il est intéressant de mentionner que l'édition de l'histoire est risquée; vous ne devriez le faire que si vous êtes absolument certain que le jeu de modifications n'a pas été poussé à ou tiré à partir de n'importe où ailleurs.

10
répondu Dan Villiom P. Christiansen 2010-08-19 15:29:13

Rollback-and-reapply est une solution très simple, mais elle ne peut aider qu'avec le dernier commit. Les Files d'attente Mercurial sont beaucoup plus puissantes (notez que vous devez activer L'Extension pour utiliser les commandes "hg q*").

6
répondu Anton N. Petrov 2009-10-26 08:06:50

Je l'ai fait comme ça. Premièrement, ne poussez pas vos changements ou vous n'avez pas de chance. Saisir et d'installer le effondrement extension. Commettre un autre mannequin de l'ensemble de modifications. Ensuite, utilisez collapse pour combiner les deux jeux précédents en un seul. Il vous demandera un nouveau message de propagation, vous donnant les messages que vous avez déjà comme point de départ. Vous avez effectivement modifié votre message de propagation original.

1
répondu jls 2010-08-11 23:18:08

un hack que j'utilise si la révision que je veux éditer n'est pas si ancienne:

disons que vous êtes à rev 500 et que vous voulez éditer 497.

hg export -o rev497 497
hg export -o rev498 498
hg export -o rev499 499
hg export -o rev500 500

éditez le fichier rev497 et changez le message. (C'est après les premières lignes précédées de "#")

hg import rev497
hg import rev498
hg import rev499
hg import rev500
1
répondu Doru Chiulan 2013-08-19 13:46:40

il y a une autre approche avec l'extension MQ et les commandes de débogage . C'est une façon générale de modifier l'histoire sans perdre de données. Permettez-moi d'assumer la même situation que Antonio .

// set current tip to rev 497
hg debugsetparents 497
hg debugrebuildstate
// hg add/remove if needed
hg commit
hg strip [-n] 498
0
répondu Crend King 2017-05-23 12:09:48

un petit bijou dans la discussion ci - dessus-merci à @Codest et @Kevin Pullin. Dans TortoiseHg, il y a une option dropdown adjacente au bouton commit. Sélectionner "Modifier la révision en cours" renvoie le commentaire et la liste des fichiers. DONC utiles.

0
répondu Merlin 2014-12-13 19:40:11