允许hgsubversion SVN克隆推回的步骤

Jon*_* L. 7 svn mercurial hgsubversion

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

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

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

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

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

Rud*_*udi 9

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

编辑步骤以展平历史记录:

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

您需要激活mq和rebase扩展名

第一步是创建备份仓库,因为您将需要它作为即将发生的合并冲突的参考(期望其中许多冲突).

假设您的图表如下所示:

C1--C2--C3------M1--C5--C6--C7---M2--
  \            / \              /
   \--B1--B2--/   \--B3--B4-B5-/
Run Code Online (Sandbox Code Playgroud)

然后第二步是在C3之上修改B1 + B2: hg rebase -b B2 -d C3

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

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

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

C1--C2--C3--B1'--B2'--C5'--C6'--C7'---M2'--
                   \                 /
                    \--B3'--B4'-B5'-/
Run Code Online (Sandbox Code Playgroud)

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

C1--C2--C3--B1'--B2'--C5'--C6'--C7'--B3''--B4''--B5''
Run Code Online (Sandbox Code Playgroud)

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

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

S1--S2--S3--C1--C2--S4--S5--C3-C4--C5--C6--C7--S6--S7
Run Code Online (Sandbox Code Playgroud)

现在将所有内容从(包括)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 commits(hg pull »svn-remote«)了.然后,您逐个重新应用所有本地修补程序,hg qpush并修复当前正在发生的所有合并冲突.当您完成一个冲突时,您可以将当前补丁移动到mercurial commit中hg qfinish -a,并将当前状态发送给hg push »svn-remote«.