71 votes

Comment sélectionner une seule révision dans Mercurial?

Dans Mercurial / TortoiseHg, à l'aide de l'exemple suivant, quel est le moyen le plus simple de fusionner la révision "G" dans le référentiel A sans prendre D, E et F (supposons que G ne dépend pas de D, E ou F).

 Repo A: A - B - C

Repo B (Clone of A) A - B - C - D - E - F - G
 

Est-ce qu'un patch est le meilleur pari?

79voto

Ry4an Points 56453

Tonfa est droit. Ce que vous décrivez n'est pas le 'fusion' (ou 'poussant' ou 'tirant'); c'est un "écrémage". Une poussée ou une traction déplace toutes les révisions d'un repo à un autre qui ne sont pas déjà dans ce repo. Un "fusionner" prend deux "têtes" et les fusionne à une nouvelle révision qui est la combinaison des deux.

Si vous avez vraiment besoin pour aller de G-dessus, mais ne peut pas respecter ayant D,E,F il devrait vous hg à l'exportation "G de pensions de Un, et puis" hg à l'importation " repo A. La Transplantation d'extension est un wrapper autour de l'exportation/importation avec quelques subtilités pour aider à éviter de déplacer le même ensemble de modifications sur plusieurs périodes.

Cependant, l'inconvénient à l'utilisation de l'importation/exportation, la greffe, et de l'écrémage en général, c'est que vous ne pouvez pas vraiment aller plus G sans ses ancêtres, parce que dans la Mercurial, un ensemble de modifications du nom est sa "hashid" qui comprend les hashids de ses parents. Parents différents (G nouveau parent serait C et non F) désigne un autre hashid, il n'est donc pas G plus -- c'est le travail de G, mais une nouvelle révision par son nom.

Se déplaçant sur G comme quelque chose de nouveau, nous allons l'appeler G' (Gee premier), n'est pas une grosse affaire, pour certaines utilisations, mais pour d'autres c'est un gros pain pita. Lorsque bientôt repo B est une nouvelle révision, H, et que vous voulez le déplacer sur son parent sera de changement de G à G', qui ont des tables de hachage. Cela signifie que H va se déplacer sur comme H' -- 100 ensembles de modifications en bas de la ligne et vous aurez des différentes hashids pour tout parce que vous ne pouvait pas supporter d'avoir D,E,F dans repo A.

Les choses vont devenir encore plus hors de contrôle si/lorsque vous souhaitez déplacer le contenu de Pensions de Un dans des Pensions de B (l'opposé de la direction de votre déplacement antérieur). Si vous essayez de faire un simple "hg push" de A à B, vous obtiendrez G' (et H' et par la suite descendants) qui seront les doublons de la révision que vous avez déjà dans des Pensions de B.

Quelles sont vos options?

  1. N'avez pas de soins. Vos données sont toujours là tu viens de finir avec identiques avec des noms différents et plus de travail sur l'avenir des échanges entre les deux titres. Ce n'est pas mal, c'est juste un peu maladroit peut-être, et certaines personnes ne se soucient pas.
  2. Déplacez tous D,E et F au cours des Pensions de A. vous pouvez Vous déplacer toutes les révisions plus si ils sont inoffensifs et d'éviter tous les tracas. Si elles ne sont pas si inoffensifs que vous pouvez les déplacer et ensuite faire un hg sauvegarde " pour annuler les effets de la D,E et F dans une nouvelle révision H.
  3. Donnez G mieux la filiation pour commencer. C'est-à-dire pour me parler de cela parce que c'est trop tard pour aller dans cette voie (sans édition de l'histoire). Ce que vous devriez avoir fait avant de travailler sur l'ensemble de modifications G a été de hg update C. Si G ne dépendent pas ou exiger des révisions D,E, et F, alors il ne devrait pas être de leur enfant.

Si, au lieu de vous mettre à jour à C d'abord, vous aurez un graphique comme ceci:

A - B - C - D - E - F
          \
            G

ensuite, l'ensemble de la réponse à cette question serait juste hg push -r G ../repoA et G pourrait se déplacer plus proprement, tout en conservant son même hashid, et D, E et F ne serait pas aller avec elle.

Mise à JOUR:

Comme l'a souligné dans les commentaires. Avec moderne Mercuriels l' hg graft de commande est le moyen idéal pour le faire.

47voto

Iodnas Points 575

En référence au titre, qui traite de "cherry picking" en général, je donne l'exemple de travailler dans un repo, comme les moteurs de recherche internet peut amener des gens d'ici pour le "cherry picking" en général. Travailler dans un référentiel, il serait fait avec hg graft::

hg update C
hg graft G

Le résultat est:

            G'
          / 
A - B - C - D - E - F - G

Ce qui est commun si G est une correction de bug appliqué à un master signet de la branche, et le nouveau chef devient un freeze signet de la branche.

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