Question

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

Je sais 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 d'ensembles de modifications à partir d'une autre branche.

Était-ce utile?

La solution

MQ comme mentionné Tchad sont un moyen. Il y a aussi des solutions plus légères:

  • l'extension Enregistrement qui fonctionne à peu près de la même façon que darcs enregistrement. Il est distribué avec Mercurial.
  • Shelve l'extension qui vous permet de "INITIAL" certains changements, vous permettant de engager un sous-ensemble de vos changements (ceux qui ne sont pas mis en veilleuse)

Autres conseils

Si vous utilisez 1.x TortoiseHg pour Windows, cette fonctionnalité est implémentée magnifiquement dès la sortie de la boîte (pas d'extensions nécessaires).

  1. Exécutez le TortoiseHg Commit Tool.
  2. Choisissez un fichier pour lequel vous ne veulent commettre un sous-ensemble de son changements.
  3. Cliquez sur le Hunk onglet de sélection dans la fenêtre de prévisualisation.
  4. Double-cliquez ou utilisez la barre d'espace pour bascule qui changent Hunks devraient être inclure dans la livraison.

TortoiseHg 2.x , l'onglet Sélection Hunk est maintenant disparu. A sa place, est outil Shelve. Il a quelques fonctionnalités que l'ancienne sélection de gros morceau. Ces nouvelles fonctionnalités viennent au prix d'une certaine complexité supplémentaire.

entrer image description ici

Notez qu'il n'y a pas nécessaire d'activer explicitement l'extension Mercurial Shelve lorsque vous utilisez cette fonction. Selon Steve Borho (principal développeur de TortoiseHg) à une question différente TortoiseHg : "Nous avons une copie locale de l'extension shelve et remettent en directement."


TortoiseHg 2.7 + , cette fonctionnalité a été améliorée et réintroduite. Il est maintenant construit directement dans l'outil Engagez:

exemple de sélection de changement de l'outil commit

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

Le changement de Sample.txt qui sera inclus est cochée dans le changement inférieur droit sélection partie de l'image. Le changement qui sera exclu est décochée et la vue diff est grisé. Notez également que l'icône de l'outil shelve est encore facilement disponible.

Le tutoriel Queues Mercurial est terrible pour ce cas d'utilisation. Tous les exemples que je suppose que vous avez vu encore faire commettras et vous actualisez un seul patch. La plupart du temps ce n'est pas le cas, et vous avez 2 ou 3 commits que vous souhaitez é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 est de courge A commet, B et C. Première initialisation Mq:

$ hg qinit

Maintenant, nous devons « importer » les commits A, B et C dans la file d'attente de patch. Laisse supposer qu'ils sont les 3 derniers commits. Nous pouvons utiliser la syntaxe de révision « -N » pour les importer comme ceci:

$ hg qimport -r -3:-1

Cela signifie que l'importation sous forme de plaques de 3 rustines jusqu'à la dernière validation. Vous pouvez vérifier l'état de ces patchs avec hg qseries. Il devrait montrer quelque chose comme ceci:

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

Lorsque les numéros 101, 102 et 103 correspondent aux numéros de révision locale des commits A, B et C. Maintenant ces patches sont appliqués , ce qui signifie les changements qu'ils décrivent sont déjà dans la copie de travail. Vous pouvez vous débarrasser des changements de la copie de travail et de les retirer de l'histoire de commits, de les enregistrer sous forme de patch uniquement en utilisant hg qpop. Vous pouvez dire à la pop change hg qpop; hg qpop C et B de la pile, ou spécifier un patch pour « pop à ». Dans ce cas, ce serait quelque chose comme ceci:

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

Vous avez maintenant les patchs pour les commits B et C dans la file d'attente de patch, mais ils ne sont pas appliquées (leurs changements ont été « perdus » - ils existent seulement dans la zone de file d'attente de patch). Maintenant, vous pouvez plier ces patchs dans le dernier, à savoir, 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 changer le message de commit. Par défaut, le message sera la concaténation des messages de validation pour les modifications A, B et C, séparés par des astérisques. La bonne chose est que va tabulations hg qfold compléter les patches si vous utilisez bash et que le script hg-complétion sourced. Cela laisse l'histoire comme celui-ci, où A + B + C est un commettras qui est la combinaison des 3 patches qui nous intéressent:

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

Un autre cas d'utilisation est si nous avons le même genre d'histoire comme avant, mais nous voulons déposer B et correctif fusion A + C. Ceci est assez similaire à ci-dessus en fait. Lorsque vous arrivez à l'étape de qfold, vous simplement plier dans le dernier commit plutôt que les 2 derniers commits:

$ hg qfold -e 103.diff

Cela laisse le changement B dans la file d'attente de patch, mais il est pas appliqué à la copie de travail et son engagement n'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 commettras qui combine les changements A et C:

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

Un dernier cas d'utilisation peut être que vous devez appliquer seulement engager C. Vous feriez cela en exécutant le qimport comme ci-dessus, et vous crèveront tous les correctifs que vous ne vouliez pas:

$ hg qpop -a

Les moyens de drapeau -a pop de tous les patches. Maintenant, vous pouvez appliquer simplement celui que vous ne voulez:

$ 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 la file d'attente tripoter. Cela peut se faire avec:

$ hg qfinish -a

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

Je sens que je manque quelque chose parce que personne n'a suggéré déjà.

La commande normale « commit hg » peut être utilisé pour choisir de manière sélective ce qu'il faut engager (vous n'avez pas à valider toutes les modifications en attente dans le répertoire de travail local).

Si vous avez un ensemble de changements 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 pouvez engager 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 super pratique de la ligne de commande parce que vous devez taper à la main les fichiers à engager de manière sélective (vs un processus case GUI comme la tortue), mais il est à peu près aussi simple qu'il obtient et ne nécessite aucune extension. Et fichier englobement peut probablement aider à réduire la dactylographie (comme il le ferait ci-dessus, les deux fichiers engagés partagent de façon unique « Liferay » dans leurs noms de fichiers.

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

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

[extensions]
record=

Ensuite, il suffit de taper au lieu de hg record hg commit, et vous pourrez sélectionner les changements auxquels les fichiers que vous souhaitez valider.

Vous pouvez également utiliser la crecord l'extension qui fournit une interface plus agréable pour examiner et sélectionner les changements. (Il est pas distribué avec Mercurial, cependant, et je l'ai vu de temps en temps gâcher un commit donc il est pas tout à fait sans bug.)

Le temps a passé. Semble la meilleure option est maintenant hg commit --interactive

Je crois Files d'attente mercurielles remplit ce rôle pour Mercurial.Il y a un très bon tutoriel lié là-bas.

Essayez QCT (Qt Commit Tool). Il a une « sélectionner des changements » fonction qui démarre un outil de fusion 3 voies pour vous d'annuler les changements individuels. Une fois que vous commettez, ces modifications « défais » reviennent.

J'utilise commit-patch. Il est un script qui vous permet de modifier la diff avant de commettre. Il est vraiment agréable avec diff mode de Emacs et vc mode.

Dans le passé, je crecord, mais il a des bugs liés à unicode (en fait l'extension d'enregistrement a les bugs qui crecord dépend).

D'abord, vous devez oublier tout ce que vous étiez au courant de GUI et de revenir à la ligne de commande. Suivant le commandline faire ceci:

hg stat> filelist.txt

tuyaux tous vos fichiers modifiés dans un fichier texte appelé filelist.txt

modifier suivant votre liste de fichiers pour inclure uniquement les fichiers que vous souhaitez engager.

commit Enfin en utilisant la sytnax fileset:

hg commit "set: 'listfile: test.txt'"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top