2011-02-13 156 views
1

您好我已经将本地svn存储库转换为mercurial,提交了hg中的几个修订版,并且现在想要将这些更改恢复为svn。
任何人都可以建议如何做到这一点?如何将修订版本从mercurial推回颠覆?

我发现https://www.mercurial-scm.org/wiki/WorkingWithSubversion#With_Convert_extension,但不幸的是,我没有按照那里描述的那样进行转换(只是在本地回购中进行了hg转换),并且也没有与MQ一起工作。

是否有任何机会将个别修订推回到颠覆或是我可以对变更进行本地比较?

+0

我经历了一个相当复杂的过程,涉及到同时建立既是Mercurial又是Subversion工作副本的目录。这很容易出错,但适用于我。 – Omnifarious 2011-02-13 10:32:59

+1

您是否试图长期支持两种版本控制系统?这听起来像个坏主意。你为什么需要这个? – robert 2011-02-13 10:39:28

回答

1

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

  1. 入住一切都在你的汞回购
  2. 汞柱高达-r [最后一次修订是从SVN转换]
  3. 退房从SVN到一个干净的目录
  4. 复制从.hg目录中hg回购到您的svn结帐
  5. 检查所有这些svn变化到您的hg回购(记得添加/删除文件...这一步将需要一点,因为hg必须扫描一切这次)
  6. 合并两个头你现在使用hg(假设sv n已经在你前面移动了)
  7. 通过将修改回到原始的hg仓库并在那里测试来测试版本(如果需要的话)(这个想法是保持你的'hg + svn仓库'干净,所以丢失/添加文件易于使用SVN在各自的工具来发现)
  8. 检查在所有的变化(记得添加/删除文件)

一旦有了这种的地方,它实际上不是太难上使用两个系统互相之间......但如果你需要这个长期的话,hgsubversion可能是更好的解决方案。我个人使用上述系统,因为hgsubversion并没有处理我们过去对svn回购所做的一些比较奇怪的事情。

编辑:我对这个解决方案做了一个假设,即svn主干已经提前提前;如果情况并非如此,则此过程变得更简单。如果你想分别合并每个hg修订版本,应该没有理由不能做到这一点,它只需要多一点工作。

  • 合并汞柱REV 1的svn尖端...犯SVN
  • 合并汞柱REV 2的svn尖端...在使用svn commit
  • 合并汞柱...
1

我个人在工作中使用Mercurial来与我们的Subversion版本库一起工作。我强烈建议你使用hgsubversion进行克隆,因为它可以在进行简单的推送时提交回Subversion存储库。唯一的问题是你必须学会​​如何改变你的改变,因为你不能使用mercurial的合并功能(subversion根本无法理解变更集可能有两个父母)。

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

但是,如果你用hgsubversion克隆svn回购,你可能会(假设没有合并)在您当前转换的mercurial depot上制作。如果有合并,则在传输更改之前,您必须“线性化”它。

3

我想你可能可以使用hgsubversion

我会尝试这样做:

  1. 克隆SVN仓库使用hgsubversion。
  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. 利润!