如何将修订从mercurial推回到颠覆?

时间:2011-02-13 10:25:53

标签: svn mercurial synchronization

您好我已经将本地svn存储库转换为mercurial,在hg中提交了几个修订版,现在希望将更改恢复为svn。
任何人都可以建议如何做到这一点?

我发现https://www.mercurial-scm.org/wiki/WorkingWithSubversion#With_Convert_extension但不幸的是,我没有完成那里描述的转换(只是在本地仓库上进行了hg转换)并且也没有使用MQ。

是否有机会将各个版本推回到颠覆版本,或者我是否能够对这些更改进行局部区分?

3 个答案:

答案 0 :(得分:3)

我认为您可以使用hgsubversion

我会尝试这样做:

  1. 使用hgsubversion克隆SVN存储库。
  2. 尝试将更改从旧存储库移动到新存储库。这可能证明是棘手的。以下是一些解决方案:
    • Adding changes from one Mercurial repository to another,使用exportimport命令或transplant扩展名。
    • 也许您可以使用hg pull --force从不相关的存储库中提取更改集。 (参见How to combine two projects in Mercurial?)然后,在此之后,您需要运行merge,当您将更改推送回SVN时可能会出错。因此,您可以尝试使用rebasemq扩展名。
    • 也许您可以使用mq扩展名在旧存储库上生成一堆补丁,将它们复制到新存储库,然后应用它们。
    • 如果所有其他方法都失败了,您可以通过重新执行之前所做的更改,逐个“手动”应用每个变更集。 (hg diff -c rev_id命令很有用)
  3. 在hgsubversion副本中进行所有更改,只需push个,然后将它们添加到SVN存储库中。
  4. ...?
  5. 利润!

答案 1 :(得分:1)

我个人在工作中使用Mercurial来处理我们的subversion存储库。我强烈建议您使用hgsubversion克隆,因为它可以在执行简单推送时提交回subversion存储库。唯一的事情是你必须学习如何重新定义你的更改,因为你不能使用mercurial的合并功能(subversion根本无法理解变更集可能有两个父级)。

如果要删除subversion repo并将其替换为mercurial,则已完成转换的存储库非常有用。不幸的是,这是不可能推迟的(除非你想开始玩差异)

但是,如果使用hgsubversion克隆svn repo,您​​可能(假设没有合并)可以将您在当前转换的mercurial depot上所做的更改拉入其中。如果存在合并,则必须在传输更改之前对其进行“线性化”。

答案 2 :(得分:1)

这并不像人们想象的那么难。从长远来看,我建议你使用hgsubversion作为其他答案的建议,但有一个非常简单的短期解决方案。

  1. 检入hg repo中的所有内容
  2. hg up -r [从svn转换的最后修订]
  3. 从svn签出一个干净的目录
  4. 将.hg目录从hg repo复制到svn checkout
  5. 检查所有这些svn更改到你的hg repo中(记得添加/删除文件......这一步将需要一点,因为hg这次必须扫描所有内容)
  6. 使用hg合并你现在拥有的两个头(假设svn已经移动到你前面)
  7. 通过将更改拉回原始的hg repo并在那里进行测试来测试构建(如果需要)(这个想法是保持你的'hg + svn repo'干净,所以缺少/添加的文件很容易在相应的工具中找到)
  8. 使用svn检查所有更改(记得添加/删除文件)
  9. 一旦你实现了这一点,实际上并不是很难将两个系统一起使用......但是如果你需要长期的话,hgsubversion可能是一个更好的解决方案。我个人使用上面的系统,因为hgsubversion不处理我们过去对svn repo所做的一些相当离奇的事情。

    编辑:我在这个解决方案中假设svn主干已经在你前面移动了;如果不是这种情况,则此过程变得更加简单。如果你想分别合并每个hg修订版,你就没有理由不能这样做,它只需要做更多的工作。

    • 将hg rev 1合并到svn tip ...在svn中提交
    • 将hg rev 2合并到svn tip ...在svn
    • 中提交
    • 合并hg ......