web-dev-qa-db-fra.com

Changements de sélection de cerise mercurielle pour validation

Disons que j'ai apporté de nombreuses modifications à mon code et que je n'ai qu'à valider quelques-unes de ces modifications. Y a-t-il un moyen de le faire en mercurial? Je sais que darcs a une fonctionnalité comme celle-ci.

Je connais hg transplant peut le faire entre les branches, mais j'ai besoin de quelque chose comme ça pour valider le code dans la branche actuelle et non lors de l'ajout de jeux de modifications d'une autre branche.

57
mansu

MQ, comme le Tchad l'a mentionné, est un moyen. Il existe également des solutions plus légères:

  • Extension d'enregistrement qui fonctionne à peu près de la même manière que l'enregistrement darcs. Il est distribué avec Mercurial.
  • extension Shelve qui vous permet de "mettre en attente" certaines modifications, vous permettant de valider uniquement un sous-ensemble de vos modifications (celles qui ne sont pas mises en attente)
34
Kurt Schelfthout

Si vous utilisez TortoiseHg 1.x pour Windows, cette fonctionnalité est magnifiquement implémentée dès la sortie de la boîte (aucune extension requise ).

  1. Exécutez l'outil de validation TortoiseHg.
  2. Choisissez un fichier pour lequel vous souhaitez uniquement valider un sous-ensemble de ses modifications.
  3. Cliquez sur l'onglet Hunk Selection dans le volet d'aperçu.
  4. Double-cliquez ou utilisez la barre d'espace pour basculer les changements de morceaux à inclure dans la validation.

Pour TortoiseHg 2.x , l'onglet Sélection de gros morceau a maintenant disparu. À sa place, se trouve le outil Shelve . Il a quelques fonctionnalités de plus que l'ancienne sélection de morceaux. Ces nouvelles fonctionnalités se font au prix d'une complexité supplémentaire.

enter image description here

Notez qu'il n'est pas nécessaire d'activer explicitement l'extension Mercurial Shelve lorsque vous utilisez cette fonctionnalité. Selon Steve Borho (développeur principal de TortoiseHg) dans réponse à une autre question de TortoiseHg : "Nous avons une copie locale de l'extension Shelve et l'appelons directement."


Pour TortoiseHg 2.7 + , cette fonctionnalité a été améliorée et réintroduite. Il est maintenant intégré directement dans l'outil de validation:

example of change selection in the commit tool

Notez dans la liste des fichiers à gauche que le fichier supérieur est vérifié pour indiquer qu'il sera inclus, le deuxième fichier est décoché car il ne sera pas inclus et le troisième fichier, Sample.txt, est rempli (l'indicateur de case à cocher Null) car seules les modifications de ce fichier seront incluses dans la validation.

La modification de Sample.txt qui sera incluse est vérifiée dans la partie de sélection de modification en bas à droite de l'image. La modification qui sera exclue n'est pas cochée et la vue diff est grisée. Notez également que l'icône de l'outil d'étagère est toujours disponible.

36
mwolfe02

Le tutoriel Mercurial Queues est terrible pour ce cas d'utilisation. Tous les exemples que j'ai vus supposent que vous n'avez pas encore fait de commit et que vous actualisez un seul patch. La plupart du temps, ce n'est pas le cas et vous avez 2 ou 3 commits que vous voulez écraser ensemble ou changer d'une autre manière.

Disons que vous avez ce genre d'histoire:

---O---O---A---B---C

Le premier exemple consiste à écraser les commits A, B et C. Premier init mq:

$ hg qinit

Maintenant, nous devons "importer" les commits A, B et C dans la file d'attente des correctifs. Supposons qu'il s'agit des 3 derniers commits. Nous pouvons utiliser la syntaxe de révision "-N" pour les importer comme ceci:

$ hg qimport -r -3:-1

Cela signifie importer en tant que correctifs à partir de 3 correctifs jusqu'au dernier commit. Vous pouvez vérifier l'état de ces correctifs avec hg qseries. Il devrait montrer quelque chose comme ceci:

$ hg qseries
101.diff
102.diff
103.diff

Où les numéros 101, 102 et 103 correspondent aux numéros de révision locaux des commits A, B et C. Maintenant, ces correctifs sont appliqués, ce qui signifie que les changements qu'ils décrivent sont déjà dans la copie de travail. Vous pouvez vous débarrasser des modifications apportées à la copie de travail et les supprimer de l'historique des validations, en les enregistrant uniquement sous forme de correctif, en utilisant hg qpop. Vous pouvez soit dire hg qpop; hg qpop pour extraire les modifications C et B de la pile, ou spécifiez un correctif pour "pop to". Dans ce cas, ce serait quelque chose comme ceci:

$ hg qpop 101.diff
now at: 101.diff

Vous avez maintenant les correctifs pour les validations B et C dans la file d'attente des correctifs, mais ils ne sont pas appliqués (leurs modifications ont été "perdues" - elles n'existent que dans la zone de la file d'attente des correctifs). Vous pouvez maintenant replier ces correctifs dans le dernier, c'est-à-dire que nous créons un nouveau commit qui est l'équivalent de la somme des changements A + B + C.

$ hg qfold -e 102.diff 103.diff

Cela montrera votre éditeur afin que vous puissiez modifier le message de validation. Par défaut, le message sera la concaténation des messages de validation des modifications A, B et C, séparés par des astérisques. La bonne chose ici est que hg qfold complètera les patches par tabulation si vous utilisez bash et que le script hg-complétement provient. Cela laisse l'histoire comme ça, où A + B + C est un commit unique qui est la combinaison des 3 patchs qui nous intéressent:

---O---O---A+B+C

Un autre cas d'utilisation est si nous avons le même type d'historique qu'auparavant, mais que nous voulons supprimer le patch B et fusionner A + C. C'est assez similaire à ci-dessus en fait. Lorsque vous arrivez à l'étape qfold, vous plierez simplement le dernier commit plutôt que les 2 derniers commits:

$ hg qfold -e 103.diff

Cela laisse la modification pour B dans la file d'attente des correctifs, mais elle n'est pas appliquée à la copie de travail et sa validation n'est pas dans l'historique. Vous pouvez le voir en exécutant:

$ hg qunapplied
102.diff

L'historique ressemble maintenant à ceci, où A + C est un commit unique qui combine les changements A et C:

---O---O---A+C

Un cas d'utilisation final pourrait être que vous devez appliquer uniquement la validation C. Vous le feriez en exécutant qimport comme ci-dessus, et vous supprimeriez tous les correctifs que vous ne vouliez pas:

$ hg qpop -a

Le drapeau -a signifie supprimer tous les correctifs. Vous pouvez maintenant appliquer celui que vous souhaitez:

$ hg qpush 103.diff

Cela vous laisse avec cette histoire:

---O---O---C

Une fois que vous avez terminé avec tout cela, vous devez terminer le tripotage de la file d'attente. Cela peut être fait avec:

$ hg qfinish -a

Nous y voilà donc. Vous pouvez maintenant exécuter hg Push et ne validez que ce que vous voulez, ou hg email un patch cohérent à la liste de diffusion.

16
richq

J'ai l'impression de manquer quelque chose parce que personne ne l'a déjà suggéré.

La commande "hg commit" normale peut être utilisée pour choisir sélectivement ce qui doit être validé (vous n'avez pas à valider toutes les modifications en attente dans le répertoire de travail local).

Si vous avez un ensemble de modifications comme ceci:

M ext-web/docroot/WEB-INF/liferay-display.xml
M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
M ext-web/docroot/WEB-INF/portlet-ext.xml

Vous ne pouvez valider que deux de ces changements avec ...

hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml

Pas très pratique depuis la ligne de commande, car vous devez taper manuellement les fichiers à valider de manière sélective (par rapport à un processus de case à cocher GUI comme tortue), mais c'est à peu près aussi simple que possible et ne nécessite aucune extension. Et la globalisation de fichiers peut probablement aider à réduire la frappe (comme cela serait le cas ci-dessus, les deux fichiers validés partagent de manière unique "liferay" dans leurs noms de chemin.

16
Gary Affonso

Vous pouvez utiliser extension d'enregistrement , qui est distribué avec Mercurial.

Vous devez l'activer dans votre ~/.hgrc d'abord, en l'ajoutant au [extensions] section:

[extensions]
record=

Ensuite, tapez simplement hg record au lieu de hg commit, et vous pourrez sélectionner les modifications à apporter aux fichiers à valider.

Vous pouvez également utiliser extension de crecord qui fournit une interface plus agréable pour examiner et sélectionner les modifications. (Cependant, il n'est pas distribué avec Mercurial, et je l'ai vu parfois gâcher un commit, donc il n'est pas complètement exempt de bogues.)

7
ronnix

Un certain temps s'est écoulé. Il semble que la meilleure option soit maintenant hg commit --interactive

7
ElyashivLavi

Je crois Mercurial Queues remplit ce rôle pour Mercurial. Il y a n très bon tutoriel lié là-bas.

3
Chad Birch

J'utilise commit-patch . C'est un script qui vous permet de modifier le diff avant de valider. C'est vraiment sympa avec le mode diff et le mode vc d'Emacs.

Dans le passé, j'utilisais crecord, mais il y avait des bogues liés à l'unicode (en fait, l'extension d'enregistrement a les bogues, dont crecord dépend).

2
jpkotta

Essayez qct (Qt Commit Tool). Il dispose d'une fonction "sélectionner les modifications" qui démarre un outil de fusion à 3 voies pour vous permettre d'annuler les modifications individuelles. Après avoir validé, les modifications que vous avez "annulées" reviennent.

2
Nicolas Alvarez