【问题标题】:How do tags in Mercurial get propagated to all branches automatically?Mercurial 中的标签如何自动传播到所有分支?
【发布时间】:2015-12-21 19:48:25
【问题描述】:

假设我在 Mercurial 中有大约 50 多个功能分支。如果我这样做:

hg tag some-tag

在其中一个功能分支中,它似乎传播到所有分支。无论我在哪个功能分支,hg tags 都会显示所有标签。这一切都很好。但如果我执行hg log,它会告诉我包含对.hgtags 的更改的变更集发生在特定分支中:

changeset:   4:ea48c727fbcd
branch:      feat1
tag:         tip
user:        Daniel <xxxx@yyyy.com>
date:        Mon Dec 21 20:15:11 2015 +0100
files:       .hgtags
description:
Added tag feat-1.0 for changeset 3c81a17d4b31

Mercurial 如何使.hgtags 在所有分支中保持同步?我读过Mercurial Tag Design,但没有提及任何细节。

我问的原因是我们在工作中使用 Rhodecode for Mercurial,而这种传播在负载过重时似乎明显滞后。

这种延迟真的很烦人,因为我可以在.hgtags 文件中看到最新的标签,但hg tags 没有列出最新的标签。做另一个标签有时可以解决问题(可能是 Rhodecode 中的一个错误),但我想知道这是如何工作的,以便更好地理解底层机制。

【问题讨论】:

  • 你运行的是什么版本? Mercurial 3.4 和 3.5 对标签缓存有一些相当显着的性能改进(而 3.3 有性能回归)。
  • 忽略我之前的问题,我误解了您所说的“滞后”是什么意思。如果hg tags 缺少您当前.hgtags 中的某些内容(并且该标签未在另一个分支或另一个修订版中删除——这就是您有时可以合法地在.hgtags 中看到标签的方式,但在@ 中却没有987654333@),这意味着有一个错误。仅供参考,Mercurial 使用缓存来避免涉及的相当昂贵的计算和新提交时的更新;如果有错误,很可能是标签缓存的问题。

标签: mercurial rhodecode


【解决方案1】:

引用一些documentation:

在任何给定时间有效的标签是每个头中指定的标签。如果同一个标签在两个不同的头中指定了两个不同的修订,则会出现一个困难的情况。这个问题没有通用的“正确”解决方案。

如果标签的两个定义/更改看起来不相关......“最尖端”(例如具有较高数字修订号的那个)获胜。
...
但是,如果在两个头的共同祖先中定义了一个标签,但只在一个头中进行了更改,则更改后的优先于未更改的。

还有:

如果只有一个头部,则只考虑标签出现的最后一行。如果有多个头,则使用标签的先前定义来确定哪个头持有最近的标签......如果标签指向00000000000000000000000000000000000000000,则认为已删除。

我的猜测是,当您在需要解析的多个分支中有多个标签时,Mercurial 必须查找每个变更集以确定其修订版本以确定“最尖端”。 .hgtags 中只有变更集哈希和标记名称。

【讨论】:

    猜你喜欢
    • 2010-10-31
    • 1970-01-01
    • 2011-06-12
    • 2010-12-19
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多