简短的
如何在 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 甚至不用费心查看这些变更集。