2010-03-23 62 views
23

我们正在从Subversion迁移到Mercurial。为了便于迁移,我们创建了一个中间Mercurial存储库,它是我们的Subversion存储库的一个副本。所有开发人员将开始切换到Mercurial存储库,并且我们会定期将更改从中间Mercurial存储库推送到现有的Subversion存储库。经过一段时间之后,我们将简单地过时Subversion存储库,中间Mercurial存储库将成为新的记录系统。Mercurial到Mercurial到Subversion工作流程问题

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库。在这里,你可以看到它是修订#2263与哈希625 ...

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存储库时,我不能再将更改推送到我们的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. 

我必须回滚合并返回到工作状态。

我错过了什么?

+7

所有的图像都坏了: - \ – 2010-10-23 14:51:14

回答

22

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

hgsubversion是两件事情真的很不错:

  1. 使用水银作为颠覆客户端,无需交换SVN的
  2. 转换Subversion版本库之外更改善变

你试图将其用作更普遍的网关,这是一个非常困难的问题。 Subversion对世界有着非常严格的看法,我们必须在这方面努力。事实的真相是修订哈希只能在从Subversion提取修订版本后使用hgsubversion时才被视为final。因此,如果您的开发人员直接在Mercurial存储库之间共享变更集,而没有将Subversion作为中介,则会发生这种情况。

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

我建议将所有人都一次性移动到Mercurial--这样的混合方法只会使Mercurial在短期内比使用Mercury更困难,并且可能会让用户感到困惑。

+2

@dalroth将需要一个这样的过程:用户将r1:r2推送到hg-gateway,hg-gateway需要自动推送到subversion,用户现在必须拉出,最后用户必须'hg strip r1' – Harvey 2010-05-07 15:01:51

+0

@Harvey - 我可以吗澄清?我有一个团队想切换到hg,但是svn在这里控制了荒地。如果我们建立了一个主控制器,并且只能从主控制器svn上拉出来,那么一切都会好吗? 更长的版本:我的老板可以和我们切换到hg,但前提是只有一个团队先做一个试点项目。有足够的通用代码(更不用说构建机器仍在运行svn)完全切换到hg是不可能的。 – moswald 2010-05-25 19:52:03

+1

@mos:这将起作用,实际上,这就是我亲自做的。诀窍是学习修改后的svn工作流程。一旦你“得到”它的工作方式,你就不会有任何麻烦。你只需输入更多的命令。我实际上已经开始编写脚本来使过程(这是重复的)更容易。典型流程:[in“hg”repo]提交了一系列更改;推他们到“hsubversion”; [切换到“hgsubversion”] hg update(hgsubversion需要这个); hg push to“svn”(在你本地推送并删除你的变更集后自动重新提取); ...待续... – Harvey 2010-06-23 21:04:25

3

首先,让我说说看到这样一个详细的问题写出来是多么高兴。 :)

当你从远程执行svn repo的hg push时,问题就在发生。下面是你的例子,输出:

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 

我不是一个HG-颠覆用户,但输出表示,在做你的要求,它的拉动从svn的变化,寻找推动的过程新修订版,然后在新修订版本(的后代版本)后执行更改集的rebaserebase command将分支历史记录转换为线性历史记录,但这样做会更改变更集的父项,这会更改它们的哈希值,这看起来像是发生在您身上的事情。

再次,不是一个HG-颠覆用户,所以我不能说,如果说拉/变基总是应该发生并应该如何工作,但hgsubversion维基页面说:

你可以使用通常的Mercurial 命令来使用此存储库。 如果你有一个 定分支一系列提交,并希望将其移至 该分支的末端,使用汞 底垫--svn命令,而在尖端你的工作 ,而这些变更 会自动重新分配到新上游工作的顶部 。

这使得它的声音通常不是自动的。

我无法从你的介绍中得知,新的变更集仍在svn中创建,还是仅在mercurial中创建?

如果它们只是在mercurial中创建的,那么一个解决方法是在远程系统上设置一个svn-gateway repo,然后从那里进行推送,并且不会从该repo回到mercurial。然后,由于rebase,repo中的变更集会有不同的hashid,但它们不会回流到主远程repo和最终用户系统。

更大的修复方法是找出为什么“hg push svn:// ..重新绑定所有出站变更集”。回答那个,行为就会停止。

+0

我试着仔细观察这一点,但仍然没有运气。我找不到一个从中间存储库进行hg push的方法,如果它没有自动执行rebase,并且hg rebase --svn不会执行任何操作,因为它已经在最新版本中。 – bmurphy1976 2010-03-24 18:59:28

+0

是的,跟hg-subversion的人讨论它为什么要做rebase,以及是否可以避免。我担心我只适合工作(这是3回购解决方案)。 – 2010-03-25 02:01:40

+0

@Dalroth,@ Ry4an:hgsubversion必须进行rebase,因为有颠覆的怪癖。最终的解决方案是,如果hgsubversion可以检测到您制作hgsubversion克隆的hg克隆。然后,它会自动执行必要的下游胶条和胶版印刷。我现在在工作中使用这个过程。它有效,但你必须习惯它。如果你的hgsubversion克隆没有自动跟上颠覆服务器的最新状态(因为你必须从SVN中提取,然后将更改重新分配到新的提示中),它会变得更加复杂。 – Harvey 2010-06-23 20:57:14

1

我们现在使用的是移植命令来做类似的事情。有效地,我们在推动每个变更集之前重新创建,以避免推送合并变更集。

我们的目标是干净利益地使用颠覆项目。

  • 为所有更改创建一个subversion分支。在Mercurial中获取它。
    $ cd [svn-checkout] ; svn cp trunk branches/hg-bridge
    $ cd [hgsubversion bridge] ; hg pull ; hg update hg-bridge

  • 请查阅当地的回购新变化
    $ hg in [repo] # shows <rev> IDs you can use later

  • 拉你想进入从本地回购svn的变化
    $ hg pull [repo]

  • 嫁接你想贡献的所有变化:
    $ hg graft [rev] [rev] # rev could be 645 or b7a92bbb0e0b. Best use the second>.
    您需要单独指定每个转速,
    但您可以在一个命令中接受多个转速。

  • 检查你会推什么:
    $ hg outgoing

  • 推的变化:
    $ hg push
    威力表现出一些不相关的拉修订
    应该显示新修订版拉到,
    以及备份捆绑的路径(您不应该需要)(注释也可以用于nder GPLv2或更高版本)