允许hgsubversion SVN克隆推回的步骤

时间:2011-03-17 07:39:50

标签: svn mercurial hgsubversion

我正在开发一个主要使用SVN的团队,而我更喜欢在可能的情况下使用Mercurial。我使用hgsubversion设置了一个SVN repo的hg克隆,并且几个基本的pull / commit / push似乎运行正常。

现在经过2周的本地开发(在此期间我从外部hg repo合并了更改,并且多次从SVN repo合并了更改),我试图推送到SVN回购,但是失败了这条消息:

  

abort:抱歉,找不到合并修订版的svn parent。

我发现其他用户遇到了同样的问题,如何避免这个问题向前发展,但我没有遇到任何似乎解决了多个并行提交以清理现有hgsubversion repo的问题。

在不丢失自己的提交的情况下,我可以纠正问题的最佳方式是什么? (使用分步说明?)

1 个答案:

答案 0 :(得分:9)

您无法将hg合并推送到subversion存储库,因为SVN无法理解它们。您需要在最新的SVN提交之后重新定义更改。

修改展平历史记录的步骤:

警告,准备好做很多合并冲突

您需要激活mq和rebase扩展

第一步是创建一个备份仓库,因为你需要它作为即将发生的合并冲突的参考(期望很多)。

说你的图表如下:

C1--C2--C3------M1--C5--C6--C7---M2--
  \            / \              /
   \--B1--B2--/   \--B3--B4-B5-/

然后第二步是在C3:hg rebase -b B2 -d C3

之上修改B1 + B2

-b使用两个分支的公共基础作为分支的开始,因此mercurial发现B1是第一个偏差提交,即使你说B2到rebase也会使用它。 -d指定重新分支的目的地。

你遇到合并冲突然后确保B2'= M1的结果,否则你将在以下修订中遇到很多冲突。

之后Merge M1消失了,你的图表看起来像这样:

C1--C2--C3--B1'--B2'--C5'--C6'--C7'---M2'--
                   \                 /
                    \--B3'--B4'-B5'-/

现在你对第二次合并做同样的事情:hg rebase -b B3' -d C7',这使你的回购看起来像这样:

C1--C2--C3--B1'--B2'--C5'--C6'--C7'--B3''--B4''--B5''

重复直到您拥有所有线性版本历史记录。

在平铺历史记录之后,您需要在svn提交之上重新排序提交。 假设你的repo现在看起来像这样(S = subversion commit,C = local commit):

S1--S2--S3--C1--C2--S4--S5--C3-C4--C5--C6--C7--S6--S7

现在将所有内容从(包括)C1导入到一个mercurial队列(hg qimport -rC1:)中。要查看所有已创建的修补程序,请使用hg qseries

然后你取消应用所有补丁(hg qgoto C1.diff [this is the first one in qseries],然后是hg qpop)。然后删除颠覆的(hg qdelete S4.diff S5.diff S6.diff S7.diff)。

现在是时候重新获取svn提交(hg pull »svn-remote«)了。然后,您使用hg qpush逐个重新应用所有本地修补程序,并修复当前正在发生的所有合并冲突。完成一次冲突后,您可以将当前修补程序移动到hg qfinish -a的mercurial提交中,并使用hg push »svn-remote«发送当前状态。