19

我注意到一些 关于分支名称的问题的答案引用了 Mercurial wiki,以表明每个功能的分支或每个错误的分支命名约定可能会导致性能问题。

在提交时使用标志将分支标记为已关闭的能力是否--close-branch对此性能声明有任何影响?

4

2 回答 2

29

使用提交标志将分支标记为已关闭的能力是否--close-branch会影响此性能声明?

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

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

可能还有其他代码路径仍然在头部数量上线性扩展,这就是我们建议 close-before-merge 的原因:

$ 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"

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

于 2012-02-07T09:03:52.860 回答
25

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

Mercurial 旨在与数百个分支机构一起工作。它仍然可以很好地处理一万个分支,但是某些命令可能会显示出明显的开销,只有在工作流程已经稳定后才能看到这些开销。

MG 和我(我们是您的两个相关问题的主要回答者)的原因是因为我们一次又一次地看到人们在得知分支名称在 Mercurial 中是永久性的时变得非常恼火。这是通常的交流,每周在 IRC 中进行几次:

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

或类似地:

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

如果您希望更改永久的、永久的分支名称(而 MG,我对这两个问题的共同回答者确实喜欢这样),那么请务必使用它们,而不必担心性能。但是请注意您的工具如何表示分支:就像 Mercurial 本身一样,工具通常是根据变更集的数量而不是分支的数量而构建的。所以他们经常做一些幼稚的事情,比如将所有分支名称放在一个下拉菜单中。当命名分支变得更流行时,这个 GUI 问题最终将得到解决。

Steve Losh 出色的 Mercurial 分支指南很好地阐明了您的(四个!)选项。选择你喜欢的东西,并相信有很多人喜欢你选择的任何一个,并且至少他们中的一些人的分支比你想象的要多。

于 2012-02-07T03:08:12.400 回答