2010-10-21 54 views
16

我已经开始在SVN存储库中工作。我已经将它的一个子文件夹克隆到当地的Hg回购中,并且有hg clone将Hg变更提交回SVN

之后,我想与一位无权访问SVN存储库的同事分享。我创建了一个专用的BitBucket存储库,我们偶尔会推动这些更改,因此我必须将其撤回。

hgsubversion做一些讨厌的东西的变更,如改变他们的提交者(我相信即使散列)。当我尝试推动并拉动BitBucket回购时,我不得不做一次合并。

现在我无法更改推回版本库,由于我们亲爱的朋友,abort: Sorry, can't find svn parent of a merge revision.

如何在保持兼容hgsubversion(即不导入合并版本)的情况下,将带有svn-target的Mercurial存储库的BitBucket目标Mercurial存储库拉出来?

一些自动化的方式来做到这一点,将不胜感激,当然,但如果没有这样的事/简单的方法来做到这一点,我想是任何解决方案表示感谢。

我用hgsubversion,不hgsvn;也就是其中一个的延伸hg clone svn://repo/url。如果有必要,我愿意转换。

+1

目前还不清楚您是否使用hgsvn或hgsubversion(不同的工具)。 – tonfa 2010-10-21 23:13:22

+0

抱歉不清楚!我使用hgsubversion(扩展名)。更新的问题。 – 2010-10-23 08:43:56

回答

21

当您在Subversion版本库使用水银,你还以为像SVN那样,所以很多基本的工作流程善变的功能部分是行不通的。合并mercurial的方式在svn仓库中是不可能的。如果你已经合并了你的工作与拉SVN分支,你会得到了臭名昭著的有关消息,你现在越来越:(

我建议你阅读durin42的回答this question

编辑:要退出你目前的混乱,我建议你从SVN仓库检出点创建一个补丁(或一系列补丁),从Subversion仓库获取新的副本并应用补丁(我)您可以从您当前的回购库中完成它,您可以浏览hg diff命令。

hg diff -g -r tip -r XXX > patch 

以XXX为原始SVN结帐(我还没有测试过。)

+0

-1。我试图找到一种方法将hg存储库转换为hgsubversion存储库,然后将其与仅使用hg的操作相混淆。 “你不能这样做,不应该这样做” - 我可以自己想出来,但是我仍然想要将这些变化导入到Subversion回购中,无论发生什么变化,都可以平滑历史。 – 2010-10-24 20:17:57

+0

了解为什么它不起作用是寻找解决方案的第一步。我更新了我的答案,希望这会有所帮助。我没有安装mercurial的电脑,所以我没有测试过。但这是我会尝试的方式。 – 2010-10-24 20:52:02

+0

我会写一个脚本来取出增量差异,但也会保留日志消息。 -1 => +1,并接受。谢谢! – 2010-10-25 11:39:01

10

是的,hgsubversion的确改变了提交者的名字,因为它必须反映Subversion指定的名字。 Hgsubversion 必须然后还改变变更散列。它并不是真正的hgsubversion可以决定的东西 - 它是Mercurial设计的基础,变更集散列基于变更集中的所有信息,并包含提交者的名称。

请阅读我的hgsubversion guide了解如何正确使用hgsubversion。需要记住的重要一点是hgsubversion会将hg变成更好的svn,但它仍然是Subversion。这意味着您必须在将其历史推回到Subversion之前对其历史进行线性化,以避免合并或其他有趣的DVCS事件。

如果您确实想要利用Mercurial中的分布式功能,那么可以通过小型迭代来实现:在Mercurial中进行一些协作,线性化变更集并推回到Subversion,销毁克隆中的非线性部分,从Subversion拉。然后,您可以在Mercurial中重复一次新的协作迭代。

+0

谢谢!投票;正如另一条评论所述,我将编写一个脚本来手动线性化历史记录,只保留变更集内容和日志消息。 – 2010-10-25 11:40:08

0

我只是打了一个类似的问题,这基本上是:

  • 克隆SVN回购与HgSubversion
  • 一些合并
  • 试图把它拉回到前SVN回购
  • 工作吧

并遇到可怕的Sorry, can't find svn parent of a merge revision消息。

这就是我所做的修复它没有太多的麻烦:

  1. 下载的TortoiseSVN从this link并安装它。
  2. 使用上下文Windows资源管理器菜单中的SVN Checkout...命令(右键单击以访问它)检出SVN回购到新文件夹。
  3. 将本地HG文件夹的内容(仅限.hg子文件夹)复制到新创建的SVN文件夹中,覆盖所有文件。
  4. 右键单击该文件夹并执行SVN Commit...
  5. 垃圾你的HG回购,并从现在更新的SVN回购拉回来。

需要2分钟,所有事情都应该重新开始。你会失去一些合并&提交信息,但它不应该是一个问题,因为SVN/HgSubversion组合无法跟踪它们。