Mercurial到Mercurial到颠覆工作流问题

bmu*_*976 23 svn mercurial hgsubversion

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

Dev 1 Local --+--> Mercurial --+--> Subversion
Dev 2 Local --+                +
Dev 3 Local --+                +
Dev 4 -------------------------+
Run Code Online (Sandbox Code Playgroud)

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

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

在我的本地计算机上,我有一个已提交的变更集,可以将其推送到我们的中间Mercurial存储库.在这里你可以看到它是版本#2263,哈希625 ...

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

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

替代文字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
Run Code Online (Sandbox Code Playgroud)

我现在切换到远程存储库,并更新工作目录.

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
Run Code Online (Sandbox Code Playgroud)

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

替代文字http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/04.png

我将更改提取到本地计算机.咦?我现在有两个变更集.我的原始变更集现在显示为本地分支.

替代文字http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/05.png

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

替代文字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仍然希望推出我以前的变更集,即使它们已被推送.

显然,我做错了什么.

我也无法合并这两个版本.如果我在本地计算机上合并两个修订版,我最终会进行"合并"提交.当我将合并提交推送到中间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.
Run Code Online (Sandbox Code Playgroud)

我必须回滚合并才能回到工作状态.

我错过了什么?

dur*_*n42 22

您没有做错任何事情,事实上在您的情况下,您所看到的行为是预期的(如果对新的Mercurial用户有些混淆)结果.

hgsubversion非常适合两件事:

  1. 使用Mercurial作为Subversion的客户端,而不在svn之外交换更改
  2. 将Subversion存储库转换为Mercurial

您正在尝试将其用作更通用的网关,这是一个更难解决的问题.Subversion对世界有着非常严格的看法,我们必须在其中工作.问题的真相是,在从Subversion中提取修订版后使用hgsubversion时,修订版哈希只能被视为最终版本.因此,如果您的开发人员直接在Mercurial存储库之间共享更改集,而不将Subversion作为中介,则会发生这种情况.

由于一个非常根本的原因,rebase是自动的和非可选的:Subversion在你推送时执行rebase.如果您在推送时进行了无法更改,Subversion会为您执行该rebase,如果成功(使用非常简单的重新定位算法),它会接受提交,但不会指示发生了rebase.我们正在修补两个不同的模型.

我建议立刻将所有人转移到Mercurial上 - 像这样的混合方法只会使Mercurial在短期内变得比它需要的更难,并且可能会使DVCS新用户感到困惑.

  • @dalroth将需要一个这样的过程:用户将r1:r2推送到hg-gateway,hg-gateway需要自动推送到subversion,用户现在必须拉,最后用户必须`hg strip r1` (2认同)