从svn迁移时,我应该如何组织mercurial存储库

时间:2011-02-10 10:47:56

标签: svn mercurial migration

我们的项目按以下方式存储在subversion中:

  • 主干(主要发展在这里)
  • 分支
    • stable(软件的生产版本)
    • 内部(旧的,内部版本的软件保留在此处,此处很少提交新代码)

我应该如何组织我的mercurial个寄存器来托管它?我创建了三个存储库,一个用于主干,一个用于每个分支作为中央服务器,但是因为mercurial有分支,所以我可能做错了。至少它感觉不对,但当我试图将单个变更集从开发本地仓库推送到稳定的本地仓库时,它推动了我所有的新变更集。那不是我想要的。

EDIT1

我在后备箱中修改了623,在稳定中修改了620。我想只将变更集623推送到稳定状态。我尝试了hg push -r623 ../stable,但hg告诉我,推了4个变更集。

1 个答案:

答案 0 :(得分:6)

好的,让我们一次解决这个问题。

请注意,对于布局和组织,有很多方法可以做到这一点,唯一真正决定的人就是你。

但是,我对您在评论中概述的工作流程的建议是使用一个存储库作为默认和稳定,使用两个命名分支。

对于旧代码,我会将其保存在一个单独的存储库中,如果需要,只需将其与主要代码集合在一起即可。

因此,我将如何组织它:

  • 主存储库
    • 默认分支(你总是在Mercurial中有这个),这就是你之前称为trunk
    • 的东西
    • 稳定分支(这与之前的稳定分支类似)
  • 旧代码存储库
    • 默认分支,从主存储库中提取
    • “旧”分支,旧代码,您可以在需要时轻松地从默认合并到旧分区
      • 如果您不需要从默认值合并到old,请将所有旧代码放在默认分支中,不要为旧代码创建命名分支

专注于主存储库,这为您提供了以下能力:

  • 您可以在默认和稳定
  • 之间的单个工作文件夹中来回更新
  • 您可以轻松地跨越分支
  • 您可以轻松地从一个分支合并到另一个分支
  • 标签是全球性的,始终可见

最后一个问题是,你如何在合并时挑选变更集。

嗯,你不能。合并合并您选择的变更集+其所有祖先。这就是Mercurial合并的方式。

有两种方法可以缓解这种情况:

  • 移植扩展
  • 将变更集提交到其他地方以
  • 开头

移植扩展允许您从一个分支中取出一个或多个变更集,并将它们(移植它们)复制到另一个分支上。变更集将被标记为移植,因此未来的合并不会超过此。但问题是,除了您添加到提交消息中的任何内容之外,图形日志中没有可见的行来表明这就是您所做的。

另一种方法是将变更集提交到其他地方,最好用一个例子来描述。

我们假设您有以下两个分支:

default:  1--2--3--4--5--6
           \
stable:     x--y--z

现在,您希望在默认情况下在变更集6之上提交变更集7,然后仅将变更集“而不是2-5”“合并”到稳定分支上,正如我所说,合并不会那样做

您可以做的是找到以前的共同祖先,在这种情况下为1,在该变更集之上提交新的变更集,实际上获取此存储库日志:

default:  1--2--3--4--5--6
  |       |\
  +---    | 7
           \
stable:     x--y--z

然后,您可以将第7个变更集合并到stable和default:

default:  1--2--3--4--5--6--7
  |       |\               /
  +---    | 7------+------+
           \        \
stable:     x--y--z--7

以下是TortoiseHg如何显示最后一个存储库,我只是移动了标签:

TortoiseHg display