Skip to main content
 首页 » 编程设计

svn之Mercurial 到 Mercurial 到 Subversion 工作流问题

2025年01月19日17www_RR

我们正在从 Subversion 迁移到 Mercurial。为了便于迁移,我们正在创建一个中间 Mercurial 存储库,它是我们的 Subversion 存储库的克隆。所有开发人员都将开始切换到 Mercurial 存储库,我们将定期将更改从中间 Mercurial 存储库推送到现有的 Subversion 存储库。一段时间后,我们将简单地废弃 Subversion 存储库,中间的 Mercurial 存储库将成为新的记录系统。

Dev 1 Local --+--> Mercurial --+--> Subversion 
Dev 2 Local --+                + 
Dev 3 Local --+                + 
Dev 4 -------------------------+ 

我一直在对此进行测试,但是当我将更改从本地存储库推送到中间 Mercurial 存储库,然后再推送到我们的 Subversion 存储库时,我一直遇到问题。

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/01.png

在我的本地机器上,我有一个已提交并准备好推送到我们的中间 Mercurial 存储库的变更集。在这里你可以看到它是带有哈希 625 的修订 #2263...

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/02.png

我只将此变更集推送到远程存储库。

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/03.png

到目前为止,一切看起来都不错。变更集已被推送。
hg update 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 

我现在切换到远程存储库,并更新工作目录。
hg push 
pushing to svn://... 
searching for changes 
[r3834] bmurphy: database namespace 
pulled 1 revisions 
saving bundle to /srv/hg/repository/.hg/strip-backup/62539f8df3b2-temp 
adding branch 
adding changesets 
adding manifests 
adding file changes 
added 1 changesets with 1 changes to 1 files 
rebase completed 

接下来,我将更改推送到 Subversion,效果很好。此时,更改位于 Subversion 存储库中,我将注意力返回到本地客户端。

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/04.png

我将更改拉到本地计算机。嗯?我现在有两个变更集。我的原始变更集现在显示为本地分支。

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/05.png

另一个变更集有一个新的修订号 2264 和一个新的哈希 10c1...

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/06.png

无论如何,我将本地存储库更新为新版本。

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/07.png

我现在换了。

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/08.png

因此,我最后单击“确定并标记传出变更集”,如您所见,Mercurial 仍然希望推出我以前的变更集,即使它们已经被推送。

显然,我做错了什么。

我也无法 merge 这两个修订版。如果我在本地机器上 merge 这两个修订,我最终会得到一个“merge ”提交。当我将该 merge 提交推送到中间 Mercurial 存储库时,我无法再将更改推送到我们的 Subversion 存储库。我最终遇到以下问题:
hg update 
0 files updated, 0 files merged, 0 files removed, 0 files unresolved 
 
hg push 
pushing to svn://... 
searching for changes 
abort: Sorry, can't find svn parent of a merge revision. 

我必须回滚 merge 才能恢复到工作状态。

我错过了什么?

请您参考如下方法:

你没有做错任何事,事实上在你的情况下你看到的行为是预期的(如果对新的 Mercurial 用户有些困惑)结果。

hgsubversion 对两件事非常有用:

  • 使用 Mercurial 作为 Subversion 的客户端,无需在 svn
  • 之外交换更改
  • 将 Subversion 存储库转换为 Mercurial

  • 您正在尝试将其用作更通用的网关,这是一个困难得多的问题。 Subversion 对世界有非常严格的看法,我们必须在这个范围内工作。事情的真相是,只有在从 Subversion 中提取修订后使用 hgsubversion 时,修订哈希才能被视为最终版本。因此,如果您的开发人员在没有 Subversion 作为中介的情况下直接在 Mercurial 存储库之间共享变更集,就会发生这种情况。

    rebase 是自动的和非可选的,因为一个非常基本的原因:Subversion 在你推送时执行那个 rebase。如果您在推送时有未拉取的更改,Subversion 会为您执行 rebase,如果成功(使用愚蠢的简单 rebase 算法)它会接受提交,而不会显示 rebase 发生。我们正在拼凑两个不同的模型。

    我建议立即将所有人转移到 Mercurial - 像这样的混合方法只会在短期内使 Mercurial 的使用变得比实际需要的更加困难,并且可能会使刚接触 DVCS 的用户感到困惑。