Mercurial到Mercurial到Subversion工作流问题

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

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

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

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

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

替代文字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

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

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存储库中,并将注意力返回给本地客户端。

替代文字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

无论如何,我更新我的本地回购到新版本。

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

我现在切换。

替代文字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.

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

我错过了什么?


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

hgsubversion对两件事情真的很好:

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

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

    我建议将所有人都立即移动到Mercurial--像这样的混合方法只会让Mercurial在短期内变得比需要的更困难,并且可能会让新用户感染DVCS。


    首先,让我说说阅读这样一个详细的问题是多么高兴的事。 :)

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

    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的变化,寻找一个新的版本,然后做推的过程中rebase的变更的10c1后(后代)的新拉动版本。 rebase命令使用分支历史记录并将其转换为线性历史记录,但这样做会更改变更集的父项,这会更改它们的哈希值,这看起来就像发生在您身上的事情一样。

    同样,不是一个hg-subversion用户,所以我不能说这个pull / rebase是否总是应该发生,以及应该如何工作,但是hgsubversion wiki页面说:

    您可以使用常用的Mercurial命令来处理此存储库。 如果您在给定的分支上有一系列的提交,并且想要将它们移动到该分支的顶端,那么在您的工作提示中使用hg rebase --svn命令,这些更改集将自动在新的上游工作。

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

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

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

    但更大的解决方法是弄清楚为什么“hg push svn:// ..正在重建所有出站变更集”。 回答那个,行为就会停止。


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

    我们的目标是干净地为使用颠覆的项目贡献力量。

  • 为所有更改创建一个颠覆分支。 在Mercurial中获取它。
    $ cd [svn-checkout] ; svn cp trunk branches/hg-bridge cd [svn-checkout] ; svn cp trunk branches/hg-bridge
    $ cd [hgsubversion bridge] ; hg pull ; hg update 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 graft [rev] [rev] # rev could be 645 or b7a92bbb0e0b. Best use the second>.
    您需要分别指定每个转速,
    但您可以在一个命令中接受多个转速。

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

  • 推送更改:
    $ hg push
    这可能会显示一些不相关的拉动版本
    并应显示您的新修订为拉,
    以及备份包的路径(您不需要)(注释也可以在GPLv2或更高版本下使用)

  • 链接地址: http://www.djcxy.com/p/37547.html

    上一篇: Mercurial to Mercurial to Subversion Workflow Problem

    下一篇: How should I use Mercurial as a lone developer?