为什么我的 Mercurial 标签没有出现在标签列表中?

Why does my Mercurial tag not show up in the list of tags?

我有一个包含多个标签的 Mercurial 存储库。这些标签用于发布管理并且都包含版本号。所有标签总是添加到默认分支上。这是我的 .hgtags 文件的摘录:

55d0e566170f61935088c301ced8137b17868171 1.63
d898fc03cefa0becb880e0ad214d80aec22b79df 1.64
dfef02cc4a2f8e34ba9e34c782299708d8ec68b7 1.65
f0519f072992c39346b65332e444492fc5694e14 1.66
6537785f8093c0f3b55df0e41bb5586aa104bd9f 1.66.1

出于某种原因,1.66 标签没有出现在 TortoiseHg 中,也没有出现在 hg tags 中。我可以通过 TortoiseHg 再次添加它来使其显示,这会在文件中创建额外的两行:

0000000000000000000000000000000000000000 1.66
f0519f072992c39346b65332e444492fc5694e14 1.66

如您所见,新创建的标签的哈希值仍然与旧标签的哈希值相同。

为什么现有标签不显示?清除 .hg/cache 目录没有帮助。

当您更新到 特定标签时,标签本身会消失。这是 Mercurial stores 标签的自然结果,它在一个版本控制的文件中。有关其他示例,请参阅 the wiki,但简而言之:

hg up -r 1.66

将您带到标记为 1.66 的修订版,它本身有一个 .hgtags 文件 没有 1.66 的条目] 在其中,因为您刚刚更新到的版本是在 名称 1.66 本身进入 .hgtags 之前创建的。据推测,这就是这里发生的事情。 (根据评论编辑:显然不是。我假设因为您显示的是文件中的行,所以您主要是在查看文件。现在它非常神秘。)

注意:当使用像 1.66 这样的标签名称作为 --rev 选项,或 运行 hg tags 时,Mercurial 扫描 all 前往 所有 他们的 .hgtags 文件。有一些复杂的代码来缓存结果,因为这个扫描很昂贵,但效果是 hg tags 应该 列出标签,即使你在.hgtags 文件。


当您再次创建标签时,Mercurial 首先删除旧标签(即全零行),然后创建具有相同哈希 ID 的新标签(即 f0519f072992c39346b65332e444492fc5694e14 ) 线。新的 .hgtags 内容进入新的提交。更新到 1.66 应该会使 所有三个 行从文件中消失,因为 f0519f072992c39346b65332e444492fc5694e14 中的 .hgtags 文件是该文件的一个版本,没有1.66 的出现次数。但是只要你更新到头部,而不是标记 1.66,你现在就会看到所有三行。同时hg tags应该继续列出标签。

事实证明,相同的标签名称之前(错误地)用于此存储库上的本地标签,但随后被删除。因此,有一行删除了.hg/localtags中的标签。这似乎也覆盖了非本地标签。从 localtags 文件中删除有问题的行解决了问题。