封闭分支如何影响Mercurial的表现?

时间:2012-02-07 00:51:24

标签: mercurial branch dvcs branching-strategy

我注意到some answers有关分支名称quote the Mercurial wiki的问题,表明每个功能的分支或每个bug的分支命名约定可能会导致性能问题。在提交时使用--close-branch标志将分支标记为关闭的能力是否会对此性能声明产生任何影响?

2 个答案:

答案 0 :(得分:28)

  

在提交时使用--close-branch标记将分支标记为关闭的功能是否会对此性能声明产生任何影响?

使用hg commit --close-branch标记分支只会在变更集元数据中创建一个带有close=1标记的新变更集。然后,hg brancheshg heads等命令将不知道显示此分支/头部。这些命令使用分支缓存来加快速度,我们希望缓存能够很好地扩展分支数量。

但是,有些操作的复杂性与拓扑头的数量呈线性关系。这包括1.9版之前使用的发现协议。版本1.9中的新发现协议仍将在其“样本”中交换拓扑头,但样本大小上限为200个变更集。

可能还有其他代码路径仍然在头部数量上线性扩展,这就是为什么我们建议在合并前关闭:

$ hg update bug-123
$ hg commit --close-branch -m "All fixed"
$ hg update default
$ hg merge bug-123

而是在关闭前合并:

$ hg update default
$ hg merge bug-123
$ hg update bug-123
$ hg commit --close-branch -m "All fixed"

后一种方法在图中留下悬垂的头(拓扑头)。

答案 1 :(得分:23)

关闭分支可能不会对性能产生任何影响,但这不是重点。性能影响很小,当然不是我建议你避免使用短期开发线的永久分支名称的原因。以下是维基的相关引用:

  

Mercurial旨在与数百个分支机构合作。它仍然适用于一万个分支,但是一些命令可能会显示出明显的开销,只有在工作流已经稳定后才能看到。

MG和我(我们是你们两个关联问题中的主要回答者)的原因是因为我们一次又一次地看到人们在得知Mercurial中的分支名称是永久性的时候会非常恼火。这是通常的交换,每周几次在IRC中发挥作用:

  • 人A:“我有100个分支,我想摆脱它们!”
  • B人:“你不能。你可以隐藏它们,但Mercurial分支是永远的。”
  • 答:“但是在git我有1000个分支,随时随地摆脱它们!”
  • B:“是的,在Mercurial中,这些被称为书签。”

或类似地:

  • 人物C:“我命名了一个分支'愚蠢的功能营销让我添加',我想推动这个改变而不推动分支名称。”
  • B人:“你不能。你可以将它合并为默认值,但该名称在变更集上是永久性的。你必须重新创建变更集才能摆脱它!”
  • C:“但是在git中我的分支名称只是本地的!”
  • B:“是的,在Mercurial中,这些被称为书签。”

如果您希望永久性的永久分支名称在您的更改上(而MG,我在这两个问题上的共同回答者确实如此),那么一定要使用它们,并且不要担心性能。但是要担心你的工具如何代表分支:就像Mercurial本身一样,工具通常是为了扩展变更集的数量,而不是分支的数量。因此,他们经常做一些天真的事情,例如将所有分支名称放入一个下拉菜单中。当命名分支变得更受欢迎时,这个GUI问题最终将得到修复。

Steve Losh出色的Guide to Branching in Mercurial能很好地拼出你的(四个!)选项。选择你喜欢的东西,并确信有很多人喜欢你选择的任何一个,并且至少有一些人拥有比你更多的分支。