为什么不在单独的Mercurial分支机构工作?

时间:2012-10-09 12:13:32

标签: mercurial tags branch

我正在设置一个Mercurial存储库来跟踪第三方代码,大致遵循Rudi对this question的回答中描述的供应商默认分支方案。为了快速检索特定版本,我为每个供应商和默认版本创建了标签。

我通过提交一个空的.hgtags来建立默认分支,然后我hg branch vendor并导入第一个版本来初始化repo。添加新版本的过程如下所示:

hg up -C vendor
... load new version ...
hg commit -A -m "Adding version x.y.x"
hg tag vendor-x.y.z
hg up -C default
hg merge vendor
hg commit -m "Merging version x.y.z"
hg tag x.y.z

在合并期间,我始终保留.hgtags的本地副本,因此结果是供应商分支的.hgtags包含所有vendor-x.y.z标记,而默认分支.hgtags只包含x.y.z标记。

据我所知,Mercurial在使用标签时会考虑所有负责人的.hgtags。然而,当我运行hg tags时,结果只包含tip和x.y.z标记。无论我的工作目录更新到哪个分支,这都是一样的;它始终是默认分支.hgtags文件中的标签。

我可以更新到vendor-x.y.z标签,因此Mercurial确实看到了它们的存在,但更新似乎给了我来自供应商分支提示的代码。 x.y.z标签工作正常。

我过去主要使用Git和SVN / CVS,因此我认为这是一个理解问题,而不是技术问题。我确实尝试了两个版本的Mercurial(2.0.2和2.3.2)以获得相同的结果。

1 个答案:

答案 0 :(得分:1)

我不是在我的Mercurial系统前验证,但我认为问题是Mercurial只考虑来自拓扑头的.hgtags,而不是分支头。例如:

[1]---[2]---[5]---[6]    Default
        \         /
         [3]---[4]       Vendor

[6]是拓扑头,[4]和[6]是分支头。解决方案是在合并时保留对.hgtags的所有更改。

修改

这是我的测试。合并后我直接接受了本地.hgtags,hg tags只显示default上的标记。我无法更新到供应商标签,这与您所看到的不同。我正在使用Mercurial 2.3.1。在供应商上创建另一个变更集并创建第二个拓扑头后,重新出现缺失的标记。

hg init test
cd test
echo >a
hg ci -Am 1
hg branch vendor
echo >b
hg ci -Am 2
hg tag v1
hg update default
hg tag d1
hg merge vendor --tool internal:local
hg ci -m Merge

@REM This only shows 'tip' and 'd1'
hg tags

hg update vendor
hg tags
hg update d1

@REM This fails to update.
hg update v1

@ Add another topological head by committing to vendor
hg update vendor
echo >c
hg ci -Am 3

@ Now all tags are visible and work.
hg tags
hg update v1
hg update d1

输出:

C:\>hg init test
C:\>cd test
C:\test>echo  1>a
C:\test>hg ci -Am 1
adding a
C:\test>hg branch vendor
marked working directory as branch vendor
(branches are permanent and global, did you want a bookmark?)
C:\test>echo  1>b
C:\test>hg ci -Am 2
adding b
C:\test>hg tag v1
C:\test>hg update default
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
C:\test>hg tag d1
C:\test>hg merge vendor --tool internal:local
1 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
C:\test>hg ci -m Merge
C:\test>hg tags
tip                                4:80759c41b3cc
d1                                 0:17b05ed457d1
C:\test>hg update vendor
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
C:\test>hg tags
tip                                4:80759c41b3cc
d1                                 0:17b05ed457d1
C:\test>hg update d1
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
C:\test>hg update v1
abort: unknown revision 'v1'!
C:\test>hg update vendor
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
C:\test>echo  1>c
C:\test>hg ci -Am 3
adding c
C:\test>hg tags
tip                                5:a2c0fe73a9f1
v1                                 1:3168d0f4e5e5
d1                                 0:17b05ed457d1
C:\test>hg update v1
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
C:\test>hg update d1
0 files updated, 0 files merged, 1 files removed, 0 files unresolved