Mercurial:命名分支与多个存储库

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (46)

我们目前使用的是一个相对较大的代码库Subversion。每个发行版都有自己的分支,并且对主干执行修复并使用以下方法迁移到发布分支中。svnmerge.py

在管理这样一个使用Mercurial的发布结构方面,似乎有两个流派。每个版本都有自己的REPO,并针对发布分支进行修复,并将其推送到主分支(以及任何其他较新的发布分支)。或在单个存储库中使用命名分支(或多个匹配副本)。

在这两种情况下,我似乎都在使用类似于移植的东西来修改Cherrypick,以便将它们包含在发布分支中。

每种方法的相对优点是什么?

提问于
用户回答回答于

最大的区别是在历史中如何记录分支名称。对于指定的分支,分支名为嵌入式在每一个变化集中,并因此将成为历史的一个不可改变的部分。有了克隆,就会有无永久记录某一特定变更集的来源。

这意味着克隆非常适合于不想记录分支名称的快速实验,而命名分支则适合长期分支(“1.x”、“2.x”和类似的分支)。

还请注意,单个存储库可以轻松地容纳Mercurial中的多个轻量级分支。这样的存储库分支可以被书签标记,这样就可以轻松地找到它们。假设已经克隆了公司存储库,其外观如下:

[a] --- [b]

你黑掉了然后[x][y]:

[a] --- [b] --- [x] --- [y]

当有人把[c][d]在存储库中,所以当您拉出一个历史图时,如下所示:

            [x] --- [y]
           /
[a] --- [b] --- [c] --- [d]

在一个存储库中有两个头。工作副本将始终反映单个更改集,即所谓的工作副本父更改集。请用以下方法检查:

% hg parents

假设它报告[y]。你可以看到

% hg heads

这个报告[y][d]。如果希望更新存储库,使之成为[d],然后简单地做(替代)[d]的修订编号[d])):

% hg update --clean [d]

然后你会看到hg parents报告[d]。这意味着您的下一次提交将具有[d]作为父母。这样,您就可以修复主分支中注意到的bug,并创建变更集。[e]:

            [x] --- [y]
           /
[a] --- [b] --- [c] --- [d] --- [e]

推动变革[e]只是,你需要

% hg push -r [e]

何地[e]是变更集散列。默认情况下hg push将简单地比较存储库,并看到[x][y],和[e]失踪了,但你可能不想分享[x][y]现在还没有。

特性分支合并:

% hg update [y]
% hg merge

这将使存储库图看起来如下所示:

            [x] --- [y] ----------- [z]
           /                       /
[a] --- [b] --- [c] --- [d] --- [e]

何地[z]之间的合并[y][e]...。你也可以选择扔掉树枝:

% hg strip [x]

选择了两个克隆,您的开发克隆在创建之后会像这样[x][y]:

[a] --- [b] --- [x] --- [y]

你的上游克隆将包含:

[a] --- [b] --- [c] --- [d]

现在注意到这个bug并修复它。在这里你不必hg update因为上游克隆已经准备好使用了。你提交并创建[e]:

[a] --- [b] --- [c] --- [d] --- [e]

要在开发克隆中包含bug修复,可以将其放入其中:

[a] --- [b] --- [x] --- [y]
           \
            [c] --- [d] --- [e]

并合并:

[a] --- [b] --- [x] --- [y] --- [z]
           \                   /
            [c] --- [d] --- [e]

图看起来可能不一样,但结构相同,最终结果是相同的。利用克隆人,你必须少做一些心理记账工作。

命名分支并没有真正出现在这里,因为它们是相当可选的。在我们转向使用命名分支之前,Mercurial本身已经使用两个克隆开发了多年。除了“默认”分支之外,我们还维护一个名为“稳定”的分支,并根据“稳定”分支发布我们的版本。

用户回答回答于

我想你想把整个历史都做一遍。产生短期回购是为了短期试验,而不是像发布这样的重大事件。

“变化无常”的一个令人失望的地方是,似乎没有容易的方法来创建一个短暂的分支,玩它,抛弃它,收集垃圾。树枝是永恒的。我很同情永不放弃历史的想法,但是这些超级便宜的一次性树枝是一种git我真的很想在里面看到hg.

扫码关注云+社区