您不能将 hg 合并推送到 subversion 存储库中,因为 SVN 无法理解它们。您需要在最新的 SVN 提交之上重新调整您的更改。
编辑步骤以展平历史记录:
警告,准备好有很多合并冲突
您需要激活 mq 和 rebase 扩展
第一步是创建一个备份存储库,因为您将需要它作为即将发生的合并冲突的参考(预计其中有很多)。
假设您的图表如下所示:
C1--C2--C3------M1--C5--C6--C7---M2--
\ / \ /
\--B1--B2--/ \--B3--B4-B5-/
然后第二步是在 C3 之上 rebase B1+B2:hg rebase -b B2 -d C3
-b
使用两个分支的公共基础作为分支变基的开始,因此 mercurial 发现 B1 是第一个偏差提交,即使您说 B2 变基,也会使用它。
-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 提交之上重新排序提交。假设您的仓库现在看起来像这样(S=subversion 提交,C=本地提交):
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
并修复现在正在发生的所有合并冲突。完成一次冲突后,您可以使用 将当前补丁移动到一个 mercurial 提交中hg qfinish -a
,并使用 发送您的当前状态hg push »svn-remote«
。