假设我在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中的一个错误),但我想知道这是如何工作的,以便更好地理解底层机制。
答案 0 :(得分:3)
引用一些documentation:
在任何给定时间生效的标签是每个头中指定的标签。如果相同的标签在两个不同的头中指定两个不同的修订,则会出现一个困难的情况。没有一般的&#34;正确&#34;解决这个问题。
如果标签的两个定义/更改似乎无关......最近的&#34;最近的&#34; (例如,具有较高数字修订号的那个)获胜 ...
但是,如果标记是在两个头的共同祖先中定义的,但只在一个头中更改,则更改的标记将胜过未更改的标记。
此外:
如果只有一个头,则只考虑标签出现的最后一行。如果有多个磁头,则先前的标签定义用于确定哪个磁头保存最新的标签....如果标签指向0000000000000000000000000000000000000000,则认为它被删除。
我的猜测是滞后是当你需要解决多个分支中的多个标签时,Mercurial必须查找每个变更集以确定其修订版以确定&#34;最尖端&#34;。只有变更集哈希和标记名称位于.hgtags
。