2010-09-11 4 views
14

J'ai la situation suivante:Comment est-ce que je peux pousser/tirer un changeset individuel entre des dépôts dans Mercurial?

  • Je le site A, qui a son repo Mercurial, et nous avons mis au point pendant un certain temps. Disons que A a eu 5 révisions.
  • Nous devons maintenant créer le site B, qui est presque identique au site A, sauf pour la conception graphique, principalement. J'ai donc cloné le repo, commencé le site B, et maintenant le repo de B a tout l'histoire de A, plus un tas de changesets qui ne devraient jamais revenir à A (principalement des CSS et des images). Disons que ces changements m'ont pris 3 révisions.
  • Enfin, j'ai maintenant fait un changement à B que je voudrais revenir à A car il appartient aux deux sites. C'est la révision 9 dans le repo de B. La question est: Comment puis-je déplacer la révision 9 du repo de B dans le repo de A, sans déplacer les révisions 6-8? J'ai essayé de pousser/tirer régulièrement, mais cela déplace tous les changesets.
  • J'ai essayé d'exporter des paquets ou des correctifs, mais ceux-ci refusent d'importer dans A à cause du parent manquant.

Je pensais que l'une des beautés de la DVCS était que je pouvais faire ce genre de chose facilement (qui, dans le monde VCS « centralisé » Je pouvais corriger facilement avec des branches et la fusion, je l'ai fait avec Vault une beaucoup et c'est assez facile).

Ai-je raté quelque chose ici?

NOTE: J'ai regardé dans "MQ", mais cela semble être une grande boîte de Pandore, et il semblerait que cela affectera le cycle de validation normal juste pour être activé. Est-ce correct?

Toute aide ou pointeur sera grandement appréciée. Je vous remercie!

Daniel

Répondre

11

https://www.mercurial-scm.org/wiki/wiki/TransplantExtension

Voir la rubrique "Utilisation de greffe à cherrypick un ensemble de changesets":

transplantation peut gérer plusieurs changesets ou changeset gammes comme ceci:

hg transplant REV1:REV2 REV3 

Cet exemple serait cherrypick la gamme de changesets spécifié par REV1: REV2 et le changeset supplémentaire REV3 sur le répertoire de travail révision.

Idéalement, vous le feriez avec des branches bien?

+0

Branches: Hmmmm, pas vraiment sûr. Je n'ai pas eu beaucoup de succès pour comprendre Mercurial Branches :-) Ce sont 2 sites différents, que dans mon HD j'ai dans 2 dossiers différents ... Je sais comment faire ça avec des branches dans Vault, mais comment le faire dans Hg? Quand j'ai essayé de faire du branchement, j'avais essentiellement un dossier de travail, et je pouvais changer (* update *) laquelle des branches était là ... –

+0

Je proposais d'avoir deux branches dans chacun de ces dossiers (trois au total) . Un avec les commits partagés et l'autre avec les commits qui n'iront jamais dans l'autre repo. Vous fusionnez dans la branche partagée avec les branches spécifiques quand vous en avez besoin :-) Pour une explication sur les branches Mercurial: http://mercurial.selenic.com/wiki/Branch#Creating_a_Branch si vous avez d'autres questions, demandez :-) – ikanobori

+0

Ah, intéressant. Je vais expérimenter avec ça. Merci pour l'idée! –

11

Je pense aux commandes de cette façon:

  • hg bundle vous donne une version binaire d'un changeset et hg unbundle tournera le paquet dans exactement le même changeset sur le côté de réception.

    Bundle et dégrouper sont là pour transférer changesets sur, par exemple, le courrier électronique et le patch binaire dépendent des changesets parents d'être présents ..

  • hg export vous donne une représentation textuelle d'un changeset, et à moins que vous utilisez l'indicateur de ligne de commande --exact à hg import, puis l'application de ce correctif ne créera pas le même ensemble de modifications du côté réception. L'avantage de ne pas utiliser --exact est précisément que vous pouvez appliquer un tel patch n'importe où tant qu'il n'y a pas de conflits textuels.

  • hg transplant est juste une fine enveloppe autour de hg export et hg import.

1

Si vous voulez jamais « fold » ou sauter dans l'histoire d'une prise en pension Mercurial, vous mettez à jour simplement à la révision de base (avant la section que vous voulez plier). Si vous voulez plier tout ce qui est au-dessus dans un seul ensemble de modifications (cela semble être ce que vous voulez), vous retournez à la tête de cette branche et validez ceci (ou commettez seulement les fichiers que vous voulez). Cela créera un nouveau changeset avec les choses que vous voulez afin que vous puissiez pousser ceci sur votre site. A. Les choses que vous ne voulez pas, vous les ignorez simplement (ou dépouillez-les si vous ne pouvez pas les ignorer).

Si vous avez plusieurs ensembles de modifications au-dessus de votre pli que vous souhaitez conserver, vous devez rebase. Activez l'extension de rebase et rebasez # 9 sur # 5. S'il y a des enfants de # 9, ils seront déplacés avec. Rebase est préférable à la transplantation (qui fait une chose similaire) parce que rebase utilise une machinerie de fusion à 3 voies pour migrer les changesets, ce qui a plus de chances de réussir. La transplantation est plus ou moins juste une importation-exportation stupide, donc elle ignore l'histoire commune.

Questions connexes