2010-04-16 14 views
7

J'essaie de contribuer à un projet qui utilise Subversion. J'ai utilisé Mercurial et son extension hgsubversion pour cloner le repo. Mon travail se déroule sur une branche de fonctionnalité.Comment gérer les fusions avec hgsubversion?

Comment maintenir la branche de fonctionnalité à jour avec ce qui se passe sur la branche par défaut (hg speak), le tronc (svn speak)?

J'ai donc utilisé hg up feature pour mettre à jour la branche de fonctionnalité, puis hg pull qui m'a donné des changesets sur la branche par défaut. Donc je l'ai fait hg merge default, le commit la fusion, puis essayé hg push pour envoyer mes changesets à Subversion. Et Mercurial a déclaré: "Désolé, ne peut pas trouver svn parent d'une révision de fusion."

Répondre

1

Mercurial que quelques différents modes de branchement: http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/

Celui que vous décrivez est « branches nommées », ce qui est le plus populaire lorsque vous travaillez avec une prise en pension qui est accessible uniquement via Mercurial (ou hg -git). Cependant, lorsque vous utilisez sub-conversion hg afin de pousser des changements vers subversion, qui n'a que des branches, il vaut mieux conserver toutes vos modifications mercurielles dans la branche nommée par défaut. , et en utilisant le modèle 'clones et branches' (que je préfère quand même). Plus précisément, ce message Sorry, can't find svn parent of a merge revision. n'est pas un descendant d'une révision qui a une correspondance directe dans Subversion.

Étiez-vous vous, je reclone à partir de svn, puis déplacez mon travail dans la branche 'default' de ce repo avec la commande 'transplant' (extension packagée). Si vous voulez plusieurs fonctionnalités en parallèle w/hg-subversion utilisez des clones séparés (ils sont si bon marché), car cela correspond mieux à la façon dont subversion pense aux branches.

+0

Merci, Ryan. Mais avec votre suggestion, mon travail n'apparaîtra pas en amont (c'est-à-dire dans Subversion). Je voulais pouvoir m'engager dans la branche Subversion.En fait, je peux m'engager dans la branche Subversion, mais je ne peux pas fusionner à partir du tronc dans Mercurial. (Et comment Subversion n'a "que nominalement" des branches? Il semble que le support pour fusionner des branches dans Subversion soit plus faible que dans Mercurial, mais pas trop terrible.) Au moins, je peux séparer une branche du tronc Le problème vient quand je veux réintégrer la branche dans le coffre.) – hibbelig

+0

Je n'ai pas été clair dans ma suggestion, car rien dans ce texte ne vous empêche de pousser en amont. Je suggère simplement qu'une fois que vous avez modifié les changesets, vous vous limitez à une seule branche nommée, car la fusion normale entre les branches mercurielles vous empêcherait de pousser à la subversion (comme vous l'avez vu). Gardez tous vos csets sur la même branche nommée en territoire mercurial, en utilisant plusieurs clones si vous voulez des pistes de développement séparées, et vous devriez être très bien. –

+0

Merci encore une fois, Ryan. Comment puis-je travailler avec plusieurs branches * Subversion *, alors? Veuillez noter que j'ai fait 'hg merge' de deux branches existant dans Subversion, puis j'ai voulu ramener la fusion à Subversion. Pousser la fusion a échoué avec le message d'erreur ci-dessus. Si j'avais fait la même fusion sur le côté Subversion, la fusion serait arrivée intacte du côté de Mercurial (après 'hg pull'). – hibbelig

0

je devais comprendre cela pour moi-même et a écrite ici:

http://notebook.3gfp.com/2010/05/pushing-a-new-feature-from-a-mercurial-repo-into-an-svn-repo/

Je ne l'ai pas encore compris comment fermer une succursale dans la subversion et avoir le graphique Mercurial conserve une apparence correcte.

+0

Salut Harvey, vous faites la fusion sur le côté Subversion. J'aurais préféré fusionner du côté de Mercurial, mais si ce n'est pas possible, alors c'est comme ça, je suppose. Dommage, cependant. Kai – hibbelig

+1

@hibbelig: Oui, j'ai demandé aux auteurs de hgsubversion à ce sujet et ils ont dit que c'est une limitation svn parce que je pense qu'ils n'ont pas de double "parents" comme le fait hg. Voilà comment hg sait à propos de la fusion. – Harvey

5

J'ai enfin trouvé comment réorganiser mon référentiel après un événement comme celui décrit dans la question, afin que je puisse continuer à travailler sans avoir à reclasser le référentiel parent (ce qui est évidemment un opération lente lorsque vous tirez de Subversion!). Si la "pointe" de Subversion vous dépasse pour que vous ne puissiez plus pousser, assurez-vous que l'extension "rebase" intégrée est activée dans votre Mercurial via une ligne $ HOME/.hgrc comme ceci:

[extensions] 
rebase = 

et alors vous devriez être en mesure d'exécuter cette commande lorsque votre dépôt se coince:

$ hg rebase --svn 

Si je comprends bien, il se dissout votre branche actuelle qui vous a pris loin de Subversion HEAD, et il reconstruit au sommet la branche "pointe" dans Mercurial qui correspond à la tête dans Subversion. De là, vous pouvez continuer à travailler et réussir à pousser à nouveau. Cela a toujours fonctionné pour moi jusqu'à présent. laissez-moi savoir si vous rencontrez des problèmes!

+1

J'ai fini par utiliser cette commande plusieurs fois. Mon flux de travail pour les succursales locales contre les repos SVN a tendance à être hg pull, hg rebase - SVN, hg push. – MattGWagner

+0

Ceci n'est pas une réponse :-( – Kugel