【问题标题】:ISO Mercurial "attributes" - tags that apply to more than one changeset, applied after the changesetISO Mercurial“属性” - 应用于多个变更集的标签,在变更集之后应用
【发布时间】:2012-06-25 05:31:57
【问题描述】:

简介

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

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

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

详情

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

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

问:有人知道怎么做吗?

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

令人难以忍受的细节

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

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

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

(顺便说一句,您可以在签入后应用此类属性或标签 - 特别是如果您的 QA 流程较慢,可能是快速冒烟测试,然后是较慢的全套测试,可能需要一周时间才能完成。因此,您签入,然后,稍后,返回并应用属性,即 uniqified 日期标签。您可能稍后需要返回并修改这样的标签,例如,如果添加了更多测试,以便过去通过的变更集所有测试不再适用。例如 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,但仅在标记为 tests-pass 的变更集上运行。

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

等等

===

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

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

(我真的希望你可以在提交变更集后将它们切换到一个分支。我称之为希望功能“追溯分支”。)

===

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

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

【问题讨论】:

    标签: mercurial dvcs


    【解决方案1】:

    看看这个:Custom revision properties in Mercurial?

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

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

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

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

    【讨论】:

    • 感谢指向 custom-revision-properties-in-mercurial 的指针。有时我只需要知道没有“官方”方式就是我需要知道的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多