提交 Hg 更改回 SVN

16
我已经开始在一个SVN代码库上工作。使用hg clone,我将其克隆到了本地的Hg仓库中。
之后,我希望与一位没有访问SVN代码库权限的同事分享这个子文件夹的内容。我创建了一个私有BitBucket代码库,并定期推送更改,因此我必须拉取它们。 会对变更集做一些不好的操作,例如更改提交者(甚至我认为是哈希值)。当我尝试向BitBucket代码库推送和拉取时,我需要进行合并。
现在由于我们亲爱的朋友“abort: Sorry, can't find svn parent of a merge revision.”, 我无法将更改推回SVN代码库中。
如何从面向BitBucket的Mercurial存储库中提取svn-targetting Mercurial存储库,同时保持与hgsubversion(也就是不导入合并修订版)的兼容性?
当然,如果有自动化方法来做到这一点,那就最好了,但如果没有这样的方法/简单的方法,我将感激任何解决方案。
我使用的是hgsubversion而不是hgsvn;也就是说,是通过执行hg clone svn://repo/url命令的方式进行的。如果有必要,我也可以考虑切换到hgsvn

1
你是否使用hgsvn或hgsubversion(不同的工具)还不清楚。 - tonfa
抱歉表述不清!我使用hgsubversion(扩展)。已更新问题。 - Ivan Vučica
3个回答

21

当你在一个Subversion版本库上使用Mercurial时,你仍然必须像SVN一样思考,因此许多基本的Mercurial工作流程中的功能将无法正常工作。在svn仓库上,无法像Mercurial这样合并方式进行合并。如果您已经将自己的工作与拉取的svn分支合并,那么您将会得到现在遇到的臭名昭著的错误信息:(

我建议您阅读durin42在这个问题中的回答。

编辑: 为了摆脱当前的困境,我建议您从您从SVN存储库检出的点创建一个补丁(或一系列补丁)。从Subversion仓库获取一个新的副本并应用这些补丁。我不确定您能否从当前的repo执行此操作。您可以尝试使用hg diff命令。

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

将XXX替换为您的原始SVN checkout(我还没有测试它。)


我正在尝试找到一种方法,将一个hg仓库转换为hgsubversion仓库,因为我在使用hg-only操作后搞砸了它。 "你不能这样做,也不应该这样做" - 我可以自己想出来,但无论如何我仍然想将更改导入回Subversion仓库,无论如何都要扁平化历史记录。 - Ivan Vučica
理解为什么它不起作用是找到解决方案的第一步。我更新了我的答案,希望这会有所帮助。我现在没有安装mercurial的电脑,所以我还没有测试过。但这是我尝试的方式。 - Eric-Karl
我将编写一个脚本,可以提取增量差异,同时保留日志信息。-1 => +1,并接受。谢谢! - Ivan Vučica

10
确实会更改提交者的名称,因为它必须反映由Subversion分配的名称。hgsubversion因此还必须更改变更集哈希值。这并不是hgsubversion可以决定的事情--它内在地建立在Mercurial的设计之上,即更改集哈希值基于更改集中所有信息,包括提交者的名称。

请阅读我的hgsubversion指南以获取有关如何正确使用hgsubversion的信息。记住的重要点是,hgsubversion将hg转换为更好的svn,但Subversion仍然是主控方。这意味着您在将历史记录推回到Subversion之前,必须将其线性化,以避免合并或其他有趣的DVCS事情。

如果您确实想利用Mercurial中的分布式功能,则应该逐步进行:在Mercurial中进行一些协作,将更改集线性化并推回Subversion,销毁克隆的非线性部分,从Subversion拉取。然后,您可以在Mercurial中进行新的协作迭代。


谢谢!点赞;正如在另一条评论中提到的,我将编写一个脚本手动线性化历史记录,仅保留变更集内容和日志消息。 - Ivan Vučica

0

我遇到了一个类似的问题,基本上是:

  • 使用HgSubversion克隆SVN repo
  • 通过一些合并解决它
  • 尝试将其拉回原来的SVN repo

然后遇到了可怕的抱歉,找不到合并修订版的svn父级消息。

这是我为了不费太多力气而解决它的方法:

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

只需要2分钟,一切都应该重新开始工作。您将失去一些合并和提交信息,但这不应该是一个问题,因为SVN/HgSubversion组合无法跟踪它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接