正如您所发现的,HgSubversion 的主要限制是您需要在将 Mercurial 历史推送到 Subversion 时对其进行线性化。这意味着您的 Mercurial 历史中不能有分支,因此很难作为一个团队一起工作。
此外,当您推送 Mercurial 变更集时,HgSubversion 将执行rebase 。想象一下,您的团队在推送到团队 Mercurial 服务器之前小心地重新设置本地提交。Mercurial 的历史是这样的:
... r10 --- a1 --- a2 --- b1 --- b2 --- b3
Alice 和 Bob 在推送它们之前已经重新调整了他们的变更集。当你与 Subversion 同步时,你会得到:
... r10 --- a1 --- a2 --- b1 --- b2 --- b3
\
r11 --- r12
并且 HgSubversion 现在会将 Mercurial 变更集重新设置为[r12]
:
... r10 --- r11 --- r12 --- a1' --- a2' --- b1' --- b2' --- b3'
爱丽丝和鲍勃仍然拥有没有素数的原始未重新设置的变更集。因此,他们需要在从团队 Mercurial 服务器中提取之前进行剥离。这样的工作流程需要非常小心才能完成。
我曾经为客户设置了一个更简单的工作流程:我们没有将 Mercurial 变更集重新设置在 Subversion 修订之上,而是将文件的当前版本提交给 Subversion。这意味着我们不会在 Subversion 存储库中保留完整的 Mercurial 历史记录。另一方面,我们可以轻松处理合并等问题。
在上面的示例中,SVN 服务器将从 中获取r13
Mercurial 存储库的状态b3
。该r13
修订将很大:它包含a1
对b3
. 如果仍在使用 Subversion 的人想要查看单个更改,那么他们将不得不查看 Mercurial 服务器 - 我们放入 Subversion 的提交消息具有指向hgweb
Mercurial 中单个更改集的链接,因此很容易跳转到那里。