57 votes

Changement de sélection des cerises mercurielles pour commit

Dis, j'ai apporté beaucoup de modifications à mon code et je n'ai besoin que de valider quelques-unes de ces modifications. Y at-il un moyen de le faire dans Mercurial? Je sais que darcs a une fonctionnalité comme celle-ci.

Je sais que hg transplant peut faire cela entre les branches, mais j'ai besoin de quelque chose comme ceci pour valider du code dans la branche actuelle et non lors de l'ajout d'ensembles de modifications provenant d'une autre branche.

36voto

mwolfe02 Points 11452

Si vous utilisez TortoiseHg 1.x pour Windows, cette fonction est mise en œuvre magnifiquement droit sorti de la boîte (pas d'extensions requises).

  1. Exécutez le TortoiseHg Commettre Outil.
  2. Choisissez un fichier pour lequel vous ne souhaitez engager un sous-ensemble de ses les changements.
  3. Cliquez sur le beau gosse Sélection de l'onglet dans la fenêtre de prévisualisation.
  4. Double-cliquez ou utilisez la barre d'espace pour bascule qui changent de mecs devraient être inclus dans la livraison.

Pour TortoiseHg 2.x, le beau gosse de la Sélection de l'onglet est maintenant disparu. À sa place, est de la mettre en Veilleuse de l'outil. Il a un peu plus de fonctionnalités que le vieux morceau de sélection. Ces nouvelles fonctionnalités viennent au prix d'une complexité accrue.

enter image description here

Notez qu'il n'est pas nécessaire pour activer explicitement Mercurial Débarrasser de l'extension lors de l'utilisation de cette fonctionnalité. Selon Steve Borho (plomb TortoiseHg développeur) en réponse à un autre TortoiseHg question: "Nous avons une copie locale de la mettre en veilleuse de l'extension et de l'appeler directement."


Pour TortoiseHg de 2,7+, cette fonction a été améliorée et re-présenté. Il est maintenant directement intégré à la validation de l'outil:

example of change selection in the commit tool

Avis dans la liste des fichiers sur la gauche, le haut de fichiers est cochée pour indiquer qu'il sera inclus, le deuxième fichier est désactivée, car il ne sera pas inclus, et le troisième fichier, Sample.txt, est rempli (la case à cocher Null indicateur) parce que sélectionner uniquement les modifications de ce fichier sera inclus dans la livraison.

Le changement de Sample.txt qui sera inclus est cochée dans le coin inférieur droit de modifier la sélection de la partie de l'image. Des changements qui vont être exclus n'est pas cochée et la vue diff est grisé. Notez également que l'icône de la mettre en veilleuse de l'outil est toujours facilement disponibles.

34voto

Kurt Schelfthout Points 5437

MQ comme l'a mentionné Chad sont à sens unique. Il y a aussi des solutions plus légères:

  • Record extension qui fonctionne à peu près de la même manière que darcs record. Il est distribué avec Mercurial.
  • Shelve extension qui vous permet de "conserver" certaines modifications, ce qui vous permet de ne valider qu'un sous-ensemble de vos modifications (celles qui ne le sont pas)

17voto

Gary Affonso Points 213

J'ai l'impression de rater quelque chose parce que personne n'a suggéré que cette déjà.

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

Si vous avez un ensemble de change comme suit:

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 pouvez vous engager à seulement deux de ces changements...

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 super pratique à partir de la ligne de commande, car vous devez saisir manuellement les fichiers à s'engager de manière sélective (vs une interface graphique case processus comme une tortue) mais c'est à peu près aussi simple qu'il obtient et ne nécessite pas d'extensions. Et fichier-globbing peut probablement aider à réduire la frappe, car il serait ci-dessus, les deux commis des fichiers de manière unique à partager "liferay" dans leurs chemins d'accès.

16voto

richq Points 29694

L'Mercurial Files d'attente tutoriel est terrible pour ce cas d'utilisation. Tous les exemples que j'ai vu supposons que vous avez encore à faire un commit et que vous êtes de l'actualisation d'un seul patch. La plupart du temps ce n'est pas le cas, et que vous avez 2 ou 3 s'engage à ce que vous voulez de courge ou de modifier de quelque autre façon.

Disons que vous avez ce genre de l'histoire:

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

Le premier exemple est à la courge s'engage A, B, et C. les Premières init mq:

$ hg qinit

Maintenant nous avons besoin de "l'importation" s'engage A, B et C dans le patch de la file d'attente. Permet de supposer qu'ils sont les 3 derniers commits. On peut utiliser l'option "-N" révision de la syntaxe de les importer comme suit:

$ hg qimport -r -3:-1

Cela signifie que l'importation des correctifs à partir de 3 patchs en arrière jusqu'à la dernière validation. Vous pouvez vérifier le statut de ces patchs avec hg qseries. Il devrait afficher quelque chose comme ceci:

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

Si le nombre de 101, 102 et 103 correspondent à la local que les numéros de révision de la s'engage A, B et C. aujourd'hui, ces patchs 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 de la copie de travail et de les supprimer de l'historique des commits, de les enregistrer sous forme de patch uniquement, en utilisant hg qpop. Vous pouvez dire hg qpop; hg qpop de la pop changements C et B en dehors de la pile, ou spécifier un patch pour "pop". Dans ce cas, il serait quelque chose comme ceci:

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

Vous avez maintenant les patchs pour les révisions B et C dans le patch file d'attente, mais ils ne sont pas appliqués (leurs changements ont été "perdu" - ils n'existent que dans le patch zone d'attente). Maintenant, vous pouvez plier ces patchs dans le dernier, c'est à dire créer 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 de sorte que vous pouvez changer le message de commit. Par défaut, le message sera la concaténation des messages de commit pour que les modifications A, B et C, séparés par des astérisques. La bonne chose ici est que l' hg qfold seront onglet-complète les patchs si vous utilisez bash et ont hg-achèvement script d'origine. Cela laisse à l'histoire comme cela, où A+B+C est un commit unique qui est la combinaison de 3 patchs qui nous intéressent:

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

Un autre cas d'utilisation est de savoir si nous avons le même genre d'histoire comme avant, mais nous voulons déposer patch B et fusionner Un+C. C'est assez similaire à ci-dessus en fait. Lorsque vous arrivez à la qfold étape, il vous suffit de plier dans le dernier commit plutôt que les 2 derniers s'engage à:

$ hg qfold -e 103.diff

Cela laisse le changement de B dans le patch file d'attente, mais il n'est pas appliqué à la copie de travail et sa validation est pas dans l'histoire. Vous pouvez voir cela en exécutant:

$ hg qunapplied
102.diff

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

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

Un dernier cas d'utilisation peut-être que vous avez besoin de n'appliquer que s'engager C. Vous ferais par de l'exécution de l'qimport comme ci-dessus, et vous enlevez tous les patchs que vous ne voulez pas que:

$ hg qpop -a

L'-un drapeau signifie pop off tous les correctifs. Maintenant, vous pouvez appliquer juste celui que vous voulez:

$ hg qpush 103.diff

Cela vous laisse avec cette histoire:

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

Une fois que vous avez terminé avec tout cela, vous avez besoin pour finir de la file d'attente de violon. Cela peut être fait avec:

$ hg qfinish -a

Donc, nous y sommes. Vous pouvez maintenant exécuter hg push et seulement s'engagent exactement ce que vous voulez, ou hg email cohérente patch à la liste de diffusion.

7voto

ronnix Points 717

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

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

[extensions]
record=

Ensuite, il suffit de taper hg record au lieu de hg commit, et vous serez en mesure de sélectionner les modifications aux fichiers que vous souhaitez engager.

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

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