我认为你的谨慎是对的。机器人并不总是最好的公民,而且经常会做一些愚蠢的事情。
您最终会做什么取决于您看到的标签的用途。例如,如果您只看到 CI 系统使用它们,那么我建议将它们保留在本地。完全没有拉/推/合并问题。
有些标签可能是重复的 - 即最新稳定。我真的不在乎在这种情况下标记了哪个构建,但我不想要任何冲突,因为脚本无法解决这些问题。
如果已经定义了一个标签,并且您再次调用hg tag,除非您强制它,否则它将失败,但是这样做是添加一个更新的、稍后定义的相同标签,并且最新的一个获胜。一方面这很好,因为合并很简单,但是在你这样做的时候考虑一下情况:
hg update -r latest-stable
hg update -r latest-stable
hg update -r latest-stable
hg update -r latest-stable
每次您更新到该版本时,您都会获得一个在创建标记之前的版本(正常情况下),并且在该版本中,latest-stable 将指向之前的latest-stable。结果就是这一系列命令会让你穿越时空。
因此我会说最好要么有唯一的标签(即stable-2013-02-18),要么在两个提交中添加标签;一个删除旧标签,一个添加新标签。
hg update -r latest-stable # You're now at the commit that removed the tag.
hg update -r latest-stable # This one will error because tag doesn't exist
标签导致提交。然而,这意味着这些提交需要被推送,并且它们需要在面对人类和其他脚本的并发推送时保持稳健。特别是,自动推送会产生额外的正面,这是不好的。但是当检测到额外的头(在推送时)时,本地标签提交已经发生,即使新的头很可能可以简单地合并,有时标签也会导致冲突。
CI 机器人应该tag; pull; merge (if necessary); push。如果合并失败,不要推送,发出警报。如果推送失败(即在合并的时间内有更多变更集),请再次拉取并合并。我只是确保您的脚本非常明确地说明了它正在合并的修订。这个过程应该不会让你有多余的头脑。
我相信 Mercurial 对 .hgtags 文件的合并处理不同,因为它知道内容,因此冲突应该非常罕见。此外,标签提交通常很容易合并,因为所有更改都是.hgtags,因此来自 CI 头部的合并永远不会发生冲突。它可能的唯一原因是因为其他人使用与 CI 服务器相同的标签名称,如果他们这样做,那么他们需要在键盘上倒蜂蜜,这样他们才能造成更多伤害。
我可以看到导致问题的情况是,如果您在多个具有相同标签名称的磁头上进行 CI 标记。例如开发和发布分支都在其上运行 CI,都分配了 tests-clean 标记,但分配给不同的修订版,然后稍后合并。解决方案是,不要那样做。
希望其中一些有用。