web-dev-qa-db-fra.com

Comment choisir une seule révision dans Mercurial?

Dans Mercurial/TortoiseHg, étant donné l'exemple suivant, quelle est la façon la 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

Un patch est-il le meilleur pari?

69
Tom Hubbard

Tonfa a raison. Ce que vous décrivez n'est pas "fusionner" (ou "pousser" ou "tirer"); c'est la "cueillette des cerises". Un push ou un pull déplace tous les changesets d'un repo à un autre qui ne sont pas déjà dans ce repo. Une "fusion" prend deux "têtes" et les fusionne vers un nouvel ensemble de modifications qui est la combinaison des deux.

Si vous avez vraiment besoin de déplacer G, mais que vous ne pouvez pas accepter d'avoir D, E, F là, vous devez `` exporter hg '' G à partir du référentiel A, puis `` importer hg '' dans le référentiel A. Le extension de transplantation est un wrapper autour de l'exportation/importation avec quelques subtilités pour éviter de déplacer plusieurs fois le même ensemble de modifications.

Cependant , l'inconvénient d'utiliser l'importation/exportation, la transplantation et la sélection des cerises en général est que vous ne pouvez pas vraiment déplacer G sans ses ancêtres, car dans Mercurial, un ensemble de modifications - est son 'hashid' qui inclut les hashids de ses parents. Différents parents (le nouveau parent de G serait C et non F) signifie un hashid différent, donc ce n'est plus G - c'est le travail de G mais un nouvel ensemble de changements de nom.

Se déplacer sur G comme quelque chose de nouveau, appelons-le G '(Gee prime), n'est pas un problème pour certaines utilisations, mais pour d'autres, c'est un gros pita. Lorsque le repo B sera bientôt un nouvel ensemble de modifications, H, et que vous souhaitez le déplacer sur son parent passera de G à G ', qui ont des hachages différents. Cela signifie que H se déplacera comme H '- 100 changesets sur la ligne et vous aurez différents hashids pour tout parce que vous ne pourriez pas supporter d'avoir D, E, F dans le repo A.

Les choses seront encore plus détraquées si/quand vous voulez déplacer des trucs du Repo A au Repo B (la direction opposée de votre mouvement précédent). Si vous essayez de faire un simple "hg Push" de A à B, vous obtiendrez G "(et H" et par les descendants ultérieurs) qui seront des doublons des changements que vous avez déjà dans Repo B.

Quelles sont donc vos options?

  1. Peu importe. Vos données sont toujours là, vous vous retrouvez avec les mêmes changesets avec des noms différents et plus de travail sur les futurs échanges entre les deux dépôts. Ce n'est pas faux, c'est juste un peu maladroit peut-être, et certains ne s'en soucient pas.
  2. Déplacez tous les D, E et F vers le Repo A. Vous pouvez déplacer tous les changesets s'ils sont inoffensifs et éviter tous les tracas. S'ils ne sont pas si inoffensifs, vous pouvez les déplacer, puis effectuer une "sauvegarde hg" pour annuler les effets de D, E et F dans un nouveau jeu de modifications H.
  3. Donnez à G une meilleure filiation pour commencer. C'est méchant pour moi de le mentionner car il est trop tard pour suivre cette voie (sans historique d'édition ). Ce que vous devriez avez fait avant de travailler sur l'ensemble de modifications G était de hg update C. Si G ne s'appuie pas sur les ensembles de modifications D, E et F, ni ne les requiert, ce ne devrait pas être son enfant.

Si, au lieu de cela, vous mettez à jour en C, vous aurez un graphique comme celui-ci:

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

alors, la réponse entière à cette question serait simplement hg Push -r G ../repoA et G se déplacerait proprement, gardant son même hashid, et D, E et F n'iraient pas avec.

MISE À JOUR:

Comme indiqué dans les commentaires. Avec les Mercurials modernes, la commande hg graft Est le moyen idéal de le faire.

76
Ry4an Brase

En me référant au titre, qui traite de la cueillette des cerises en général, je donne l'exemple de travailler dans un seul dépôt, car les moteurs de recherche sur Internet pourraient amener des gens ici pour la cueillette des cerises en général. Travailler dans un référentiel, ce serait fait avec hg graft :

hg update C
hg graft G

Le résultat est:

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

Avertissement supplémentaire: les deux ensembles de modifications seront traités comme des validations indépendantes et parallèles sur les mêmes fichiers et pourraient vous faire rencontrer des conflits de fusion, c'est pourquoi la sélection des cerises devrait être évitée en général pour la gestion des succursales. Par exemple, si G est un correctif de bogue appliqué à une branche de version stable marquée comme 1.0.1, vous devriez plutôt fusionner la branche freeze avec, et de temps en temps fusionner la branche master avec les corrections de bogues de la branche freeze.

42
Iodnas