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.
MQ, comme le Tchad l'a mentionné, est un moyen. Il existe également des solutions plus légères:
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 ).
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.
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:
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.
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.
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.
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.)
Un certain temps s'est écoulé. Il semble que la meilleure option soit maintenant hg commit --interactive
Je crois Mercurial Queues remplit ce rôle pour Mercurial. Il y a n très bon tutoriel lié là-bas.
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).
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.