4

简短的

如何在 Mercurial 中使用相同的标签标记多个变更集?可能在同一个分支上,也可能在不同的分支上。

例如,类似标签的东西表明完整的 QA 测试是否运行。

我可以通过编辑文件来创建标签的多个实例,但 hg 工具几乎总是忽略除第一个之外的所有实例。

细节

我正在寻找我称之为变更集“属性”的东西——我在其他 CVS 和 DVCS 中使用过的概念,但在 Mercurial 中似乎找不到。

基本上,一个属性非常像一个标签,但是一个标签应该只引用一个单一的变更集,一个属性可能适用于多个变更集。

问:有人知道怎么做吗?

类似地:在创建变更集之后,有没有办法将描述附加到变更集。请注意,我不想重写历史记录:我不想删除或更改或替换原始签入消息。我只是想添加更多的东西——让更多的东西出现在像 hg log 这样的查询中。例如,“我忘记添加一个文件来提交 df..a3 - 改为提交 8f..77,我在其中签入了丢失的文件。

极致细节

我知道 - 您可以执行 hg tag -f 强制标签应用于多个变更集。但是许多其他与 hg 标签相关的功能实际上只适用于每个标签的单个更改。或者每条下降线至少只有一个变更集 - 即每头。

因此,您可以永远定义一个标签。我喜欢将日期或其他上下文放在这样的标签中 - 例如 tests-pass-2012-01-14。

或者你可以有一个向上移动的“浮动标签” - 例如“所有慢速测试通过的最新版本”,我可以简单地称之为“测试通过”。

(顺便说一句,您可以在签入后应用此类属性或标签 - 特别是如果您的 QA 流程较慢,可能是快速冒烟测试,然后是较慢的全套测试,可能需要一周才能完成。所以您签入, 然后, 稍后, 返回并应用属性, uniqified dated 标记。您可能稍后需要返回并修改这样的标记, 例如如果添加更多测试, 以便用于通过所有测试的变更集没有更长的时间。例如 all-tests-pass-2012-01-14 和 all-tests-pass-2012-01-15 可能适用于相同的变更集。)

但是必须将这样的固定标签统一起来是很繁重的。因此,我称之为属性:适用于多个变更集的标签,它是受版本控制的。因此,您可以将 all-tests-pass 应用于 rev 105,然后再应用于 106 和 107。但随后您意识到新测试在 106 上失败,因此您回复。

那么属性历史可能看起来像

105:
    tagged all-tests-pass on 2012-01-14-10h00 (in changeset XXX)
    tagged all-tests-pass on 2012-01-15-10h00 (in changeset YYY)

106:
    tagged all-tests-pass on 2012-01-14-13h00 (in changeset XXX)
    tagged not-all-tests-pass on 2012-01-15-13h00 (in changeset YYY)

107:
    tagged all-tests-pass on 2012-01-14-14h00 (in changeset XXX)
    tagged all-tests-pass on 2012-01-15-10h00 (in changeset YYY)

和一个修订集查询,如

 105::107 and current_attribute_tag(all-tests-pass)

= 最晚返回 105 和 107,在 YYY 位于 repo 中或之后 = 但如果克隆则返回 105、106、107,以免包含 YYY

尽管

 105::107 and attribute_tag_at_any_time(all-tests-pass)

=如果 repo 持有 XXX,则随时返回 105 106 和 107

===

我希望能够做类似的事情

  • 运行 hg bisect,但仅在标记为测试通过的变更集上运行。

  • 从 hg log 和 glog 中排除某些日志消息

等等

===

顺便说一句,我拒绝为此目的使用阶段和书签,因为它们不受版本控制。而且我希望这些属性标签是 VCed,这样我就可以按照上面提到的所有测试通过的潮起潮落。

分支几乎是我想要的,因为 Mercurial 分支实际上是变更集属性,而不是分支。但我不认为与变更集关联的分支可以在提交后更改。

(我真的希望您可以在提交变更集后将其切换到分支。我将其称为希望功能“追溯分支”。)

===

这是我为什么需要属性的一个经典示例:您是否曾经忘记将文件添加到 VCS?然后有一个无法构建的变更集?在后续更改中添加文件?...

我希望能够追溯地将变更集标记为 will-not-build--missing-files。然后让 bisect 甚至不用费心查看这些变更集。

4

1 回答 1

3

看看这个:Mercurial 中的自定义修订属性?

没有对属性的原生支持。您可以编写一个扩展程序(有一个extra属性字典与变更集一起保存)。

或者您可以将它与每个标签的多个变更集一起破解(如您所建议的)。

或者你可以将它与一个新的 all-tests-pass 分支一起破解,并在所有测试通过时让你的 CI 服务器合并到该分支(然后 bisects 是默认的尖端和所有测试通过的尖端)。

但简短的回答仍然是没有现有的本地方法可以做到这一点。

于 2012-07-10T08:12:40.033 回答