【问题标题】:How to get the name of the tag created (or modified) by a Mercurial changset?如何获取由 Mercurial 变更集创建(或修改)的标签的名称?
【发布时间】:2013-05-18 07:17:43
【问题描述】:

我正在开发一个从 Mercurial 存储库构建变更集数据库的应用程序。通过运行 hg log 并解析输出,每隔一段时间就会读取任何新的变更集。当它们在存储库中更新时,我们需要将标签信息添加到数据库中的变更集。

如果有人通过运行标记变更集:

hg tag -r 1 mytag

第一个修订版是用 mytag 标记存储库并创建新的变更集

如果我现在运行:

hg log -v -l 1 

要获取最新变更集的详细信息,summary 字段会显示“Added tag mytag for changeset b669d03aefa1”。我可以解析它并获取标记的变更集的标记和哈希的名称。

但是,如果变更集带有注释标记,例如

hg tag -r 1 mytag -m "my comment"

hg 日志 输出中的 summary 字段被“我的评论”覆盖,并且似乎没有任何方法可以找出哪个标签已添加这个变更集。

我查看了 hg log --template 变量,但似乎只有与当前变更集上的标签相关的变量 - 而不是当前变更集添加或修改的标签。

我开始使用 hg annotate .hgtags。此命令的输出将每个标签映射到创建的修订版,但是 .hgtags 文件不包括添加到远程存储库的标签,即使在拉取和更新之后也是如此。

另外,我可以通过定期查询 hg tags 的输出并随着这些更改更新变更集来维护标签列表,但是我希望有更有效(或更简单)的方法来获取直接来自修订版的标签名称。

【问题讨论】:

  • 为每个变更集创建标签看起来不正确。您能否详细说明导致您这样做的原因?为什么不使用 changesetid 作为主键?
  • 我没有为每个变更集创建标签。我们的应用程序(一个持续集成应用程序)显示存储库中的变更集表。我需要为每个变更集行显示任何标签。我们目前每 30 秒轮询一次存储库,并使用 hg log 检索最新的变更集。出于性能原因,我们只获取最新的变更集,因为我们需要支持的存储库非常大。
  • 一些变更集是针对标签的。该标签可能位于我们数据库中已经存在的先前变更集上。我需要能够获取由当前变更集更新的标签名称以及已标记的变更集的修订号。如何将其存储在数据库中并不重要,但我们有一张以 changesetid 作为主键的变更集表和另一张以 changesetid 作为外键的变更集表。
  • 每次我们轮询存储库并更新完整的changestags表时,使用hg标签来检索标签的完整列表可能最终成为唯一的解决方案。然而,我希望找到一种方法来直接从修订中获取标签名称,因为这将更有效,并且适合我们用于从我们支持的其他存储库类型(例如 Git)中检索标签的工作流程。

标签: mercurial tags


【解决方案1】:

hg tags 在仓库中检查标签的自然方式

hg tags -v 将允许您区分本地和全局标签

如果您仍想使用 hg log 变体,则可以使用新鲜的 Mercurial

hg log --template "{if(tags,'{rev} {tags}\n')}"

输出与hg tags 几乎相同,但可以限制为缩短列表

此外,如果添加的新标签 always 仅用于 比现有标签更多的新变更集,您可以使用类似

hg log -r tip --template "{latesttag}\n"

更改的输出将意味着“新标签出现在存储库中”

最后说明

您可以(在某种程度上)检测“谁”和“何时”创建|编辑的标签。这将不仅仅是单个命令 + 一些逻辑 在命令之上,而是(用于测试的 hg-git 存储库)

> hg tags
tip                              598:792955be68dd
0.4.0                            594:a3c3b8077cbe
0.3.4                            572:586b7aa96466
0.3.3                            473:9d44dafbb31c
0.3.2                            443:a9c0b93488d4
0.3.1                            436:556c3c586c4a
0.3.0                            433:fa3edeec7ed1
0.2.6                            377:46d390f404da
0.2.5                            364:bc72dd89c2c9
0.2.4                            358:b53421918a89
0.2.3                            348:5d39b98e5083
0.2.2                            322:a222399a59d7
0.2.1                            278:21ead8190d9c
0.2.0                            269:77d6c9eb02fb
0.1.0                            253:505d7cdca198

> hg log --template "{rev}: {author|person} {date|isodate}\n" .hgtags
595: Augie Fackler 2013-03-24 16:39 -0500
573: Augie Fackler 2012-11-01 09:11 -0500
474: Augie Fackler 2012-08-05 21:11 -0500
444: Augie Fackler 2012-01-27 11:52 -0600
437: Augie Fackler 2011-09-13 18:16 -0500
434: Augie Fackler 2011-09-09 16:17 -0500
378: Augie Fackler 2011-03-01 08:24 -0600
365: Augie Fackler 2010-11-02 08:37 -0500
359: Augie Fackler 2010-08-25 15:45 -0500
349: Augie Fackler 2010-07-05 11:56 -0500
323: Augie Fackler 2010-05-22 22:12 -0500
279: Augie Fackler 2009-12-26 13:46 -0600
270: Augie Fackler 2009-12-26 12:42 -0600
254: Augie Fackler 2009-10-17 20:12 -0400

对于变更集 N 中的任何(本地创建或从相关 repo 中提取)标签,可以从日志中提取变更集 N+1 的作者身份

【讨论】:

  • 感谢您的意见。使用 hg 标签可能最终成为唯一的解决方案。但是,正如我在问题末尾所说的那样,我希望找到一种方法来直接从修订版中获取标签名称,因为这样会更有效。它也适合我们用于从我们支持的其他存储库类型(例如 Git)中检索标签的工作流程。
  • @sparkplug - 添加到答案的备选方案
  • 替代方案仍然不能解决我的问题,但似乎这不是通过 hg log 或其他方式获取变更集添加的标签名称的故障安全方法。我不能假设它是最新的标签。在将当前标签列表与存储列表进行比较后,我现在使用 hg 标签检索更新数据库的当前标签列表。现在唯一的问题是,每次我调用 hg log 时可能会有多个变更集,因此无法知道哪个变更集创建了标签,也无法知道创建标签的实际时间和创建者。谢谢你的帮助。
  • 我将其标记为答案,因为似乎没有更好的解决方案
  • 感谢您提供额外信息。我确实使用 .hgtags 的存在来确定给定的变更集是否是标记变更集。但是请注意,如果 --rev 选项与 hg 标签一起使用,则标记变更集不一定是标记变更集加一。
猜你喜欢
  • 2011-04-15
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
相关资源
最近更新 更多