标签*实际上如何工作?

mpe*_*pen 3 mercurial vcs-tags

文档说所有标签都存储在其中.hgtags,但显然有一些黑魔法在这里发生.

我的标签看起来像这样:

mbayazit:~/test$ cat .hgtags 
0d80b6ba4ba3b51a44f0f1d339fcac1d4b21f387 stable
c70d8e7e516d8b9e0c520063a575b4acea1b2f94 testtag
0d80b6ba4ba3b51a44f0f1d339fcac1d4b21f387 stable
b1a360af6daf536ddc55b6b50127e88c30a227dc stable
Run Code Online (Sandbox Code Playgroud)

如果我更新到testtag,

mbayazit:~/test$ hg up testtag
1 files updated, 0 files merged, 2 files removed, 0 files unresolved
Run Code Online (Sandbox Code Playgroud)

标签消失了,

mbayazit:~/test$ cat .hgtags 
cat: .hgtags: No such file or directory
Run Code Online (Sandbox Code Playgroud)

因为testtag比其他人年长; 为什么它不按顺序我不知道.

但是当我stable再次尝试更新时,

mbayazit:~/test$ hg up stable
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
Run Code Online (Sandbox Code Playgroud)

它神奇地起作用.如果那个标签不在,.hgtags怎么可能呢?

rpe*_*kov 5

在官方标签文档的第二部分写下这句话:

将工作目录更新为特定标记会将该目录恢复到标记本身存在之前的某个点.

第一次.hgtags在标记特定修订时创建文件.将存储库状态更新为此标记的修订时,存储库的状态实际上是.hgtags在添加到版本控制之前.

这是我们添加第一个标记然后将存储库状态更新为此标记修订的示例:

PS D:\tagstest> hg init
PS D:\tagstest [default tip]> echo 'Something' > readme.txt
PS D:\tagstest [default ?1 tip]> hg addremove
adding readme.txt
PS D:\tagstest [default +1 tip]> hg ci -m "First commit"
PS D:\tagstest [default tip]> hg tag first
PS D:\tagstest [default tip]> cat .\.hgtags
9494cb0dc308d91ecae8514a341c2fa2324d3ade first
PS D:\tagstest [default tip]> hg update first
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
PS D:\tagstest [default first]> cat .\.hgtags
cat : Cannot find path 'D:\tagstest\.hgtags' because it does not exist.
Run Code Online (Sandbox Code Playgroud)

这种情况正如您在问题中描述的那样.但是,让我们进一步添加另一个标签:

PS D:\tagstest [default first]> hg up tip
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
PS D:\tagstest [default tip]> echo 'Something else' >> .\readme.txt
PS D:\tagstest [default ~1 tip]> hg ci -m "second commit"
PS D:\tagstest [default tip]> hg tag second
PS D:\tagstest [default tip]> cat .\.hgtags
9494cb0dc308d91ecae8514a341c2fa2324d3ade first
8b0455fffb17c978ef9e285905d76e34feae32f4 second
PS D:\tagstest [default tip]> hg up second
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
PS D:\tagstest [default second]> cat .\.hgtags
9494cb0dc308d91ecae8514a341c2fa2324d3ade first
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到,在更新存储库状态到第二个标记.hgtags文件之后没有消失,但是只有第一个标记,因为存储库的状态就在第二个标记被添加到.hgtags文件之前.

更新:

在您的情况下,看起来您已经在创建stable修订0d80b6ba4ba3b51a44f0f1d339fcac1d4b21f387版本c70d8e7e516d8b9e0c520063a575b4acea1b2f94(您标记为testtag)后添加了第一个标记(导致创建.hgtags文件)到修订版本.因此,当您将存储库状态更新为testtag修订版时,没有.hgtags文件,因为尚未创建它.

例:

PS D:\tagstest2> hg init
PS D:\tagstest2 [default tip]> echo "Something" > readme.txt
PS D:\tagstest2 [default ?1 tip]> hg addremove
adding readme.txt
PS D:\tagstest2 [default +1 tip]> hg ci -m "First commit"
PS D:\tagstest2 [default tip]> echo "Something else" > .\readme.txt
PS D:\tagstest2 [default ~1 tip]> hg ci -m "Second commit"
PS D:\tagstest2 [default tip]> echo "Something more" >> .\readme.txt
PS D:\tagstest2 [default ~1 tip]> hg ci -m "Third commit"
PS D:\tagstest2 [default tip]> hg tag -r 0 first
PS D:\tagstest2 [default tip]> hg tag -r 1 second
PS D:\tagstest2 [default tip]> hg gl
@  4[tip]   a0753742f012   2013-08-21 00:29 +0400   peshkovroman
|    Added tag second for changeset 7e4896c8ef3e
|
o  3   cee5760a9d1c   2013-08-21 00:29 +0400   peshkovroman
|    Added tag first for changeset 12f055c90ee8
|
o  2   f4c00a7394e1   2013-08-21 00:29 +0400   peshkovroman
|    Third commit
|
o  1[second]   7e4896c8ef3e   2013-08-21 00:28 +0400   peshkovroman
|    Second commit
|
o  0[first]   12f055c90ee8   2013-08-21 00:28 +0400   peshkovroman
Run Code Online (Sandbox Code Playgroud)

当您调用时hg up second,您的存储库状态将更新为修订版1,但.hgtags仅在修订版2中创建.