首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mercurial到Mercurial再到Subversion工作流问题

Mercurial到Mercurial再到Subversion工作流问题
EN

Stack Overflow用户
提问于 2010-03-24 03:57:37
回答 3查看 5K关注 0票数 23

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

代码语言:javascript
复制
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

到目前为止,一切看起来都很好。变更集已被推送。

代码语言:javascript
复制
hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

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

代码语言:javascript
复制
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仍然希望推送我之前的变更集,尽管它们已经被推送了。

很明显,我做错了什么。

我也不能合并这两个版本。如果我在本地机器上合并两个修订版,我最终会得到一个“合并”提交。当我将合并提交推送到中间Mercurial存储库时,我不能再将更改推送到Subversion存储库。我最终遇到了以下问题:

代码语言:javascript
复制
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.

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

我遗漏了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-25 23:15:58

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

hgsubversion真的有两个好处:

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

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

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

我建议大家立即转向Mercurial --像这样的混合方法只会在短期内使Mercurial的使用变得比需要的更加困难,并有可能使DVCS的新手感到困惑。

票数 22
EN

Stack Overflow用户

发布于 2010-03-24 12:23:52

首先,让我说一下,读到这么详细的问题是多么愉快。:)

当您从远程对svn repo执行hg push时,问题就发生了。以下是示例输出:

代码语言:javascript
复制
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-subversion用户,但是输出表明在执行您请求的推送的过程中,它从svn repo中提取更改,找到新的修订版本,然后在新提取的修订版本(后代)之后执行变更集10c1rebaserebase command获取分支历史并将其转换为线性历史,但在这样做的过程中,它会更改变更集的父项,从而更改它们的散列,这看起来就像发生在您身上的事情。

再说一次,我不是一个hg-subversion用户,所以我不能说拉/重基数是否总是应该发生,以及它是如何工作的,但hgsubversion维基页面上说:

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

这让它听起来并不是自动的。

从你的介绍中我不太清楚,新的变更集还在svn中创建,还是只在mercurial中创建?

如果它们只是在mercurial中创建的,那么一种解决方法是在远程系统上设置一个svn网关存储库,并从那里执行推送,并且永远不会从该存储库拉回mercurial。然后,由于rebase,该存储库中的变更集将具有不同的hashids,但它们不会回流到主远程存储库和最终用户系统中。

不过,更大的解决办法是找出为什么"hg push svn://..正在重新设置所有出站变更集的基础“。回答这个问题,行为就会停止。

票数 3
EN

Stack Overflow用户

发布于 2012-05-25 16:48:48

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

我们的目标是干净利落地为使用subversion的项目做出贡献。

  • 为您的所有更改创建subversion分支。在Mercurial中获取它。

$ cd [svn-checkout] ; svn cp trunk branches/hg-bridge

$ cd [hgsubversion bridge] ; hg pull ; hg update hg-bridge

  • Check您的本地存储库以获取新更改

$ hg in [repo] # shows <rev> IDs you can use later

  • Pull要从本地存储库导入svn的更改

$ hg pull [repo]

  • Graft您要贡献的所有更改:

$ hg graft [rev] [rev] # rev could be 645 or b7a92bbb0e0b. Best use the second>.

您需要单独指定每个版本,

但你可以在一个command.

  • Check中移植多个转速,这是你想要推动的:

$ hg outgoing

  • Push更改:

$ hg push

这可能会显示一些不相关的拉出修订

并且应该显示您的新修订为已拉出,

以及备份包的路径(您不需要)。(也可以在GPLv2或更高版本下使用注释)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2503152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档