2014-10-07 40 views
1

我在回购工作用的命名约定分离与顶级分支的命名空间孤立的项目,如:当我配置我本地的git的了projectA如下Git只提取“namespaced”远程标签?

A1 - A2 - A3 - A4 - ... - An projectA/* 

B1 - B2 - B3 - B4 - ... - Bn projectB/* 

[remote "origin"] 
    fetch = +refs/heads/projectA/*:refs/remotes/origin/projectA/* 

我期望值为git-fetch manual表示有关默认行为:指向从远程存储库下载的对象的标记将在本地获取并存储。

也就是说,如果我提取projectA/*,只有指向A1,A2,...或An的标签应该被获取。然而,当我在本地projectA git上运行git fetch origin时,说projectB/blah标记指向提交Bn被提取到本地。

我完全困惑。有什么我做错了吗? “默认行为”是什么意思?git fetch有没有--tags

回答

2

没有--tags,git fetch从字面上检查每个标记引用以查看是否要获取其目标SHA-1。

整个fetch操作开始,本质上,运行git ls-remote(尝试它,看看它产生什么)。然后,如果您没有指定--tags,则它会遍历所有参考文献(在名为find_non_local_tags的例程builtin/fetch.c中),那些以refs/tags/开头的标记是标记,因此它会继续查看这些标记是否引用将提取的对象。如果对象将获取的标签添加到裁判的名单进行更新。

随着--tags,然而,同样的代码只是增加了tag_refspec到裁判,规格是无法提取。这在remote.c定义基本上是refs/tags/*:refs/tags/*的预解析形式

请注意,在整个过程中,标记只是“以文字前缀开头的引用“。没有“名称空间标签”:标签名称空间是以refs/tags/开头的整个名称空间。什么混帐所说的“远程分支机构”或“远程跟踪分支” 有独立的子名称空间:他们都在refs/remotes/但这些远程origin专门保存在refs/remotes/origin/,而那些远程bobrefs/remotes/bob。所以我不太确定问题中“命名空间远程标签”的含义。

+0

在我的情况下,分支命名空间指的是完全独立的项目。例如,分支'projectA/*'和'projectB/*'必须没有交集,并且'projectB/blah'标记不能在任何'projectA/*'分支中提交。因此,当我获取'projectA/*'时,我期望我只在'projectA/*'行,即'projectA/*'标签上获得标签。 – 2014-10-07 17:22:14

+0

所以你的意思是你有例如'refs/tags/projectB/foo'指向提交'1234567 ...(所有在服务器上)永远不会被提取(在客户端上),但'refs/tags/projectB/foo'被创建(在客户端)呢? – torek 2014-10-07 17:33:53

+0

是的。这是我很困惑的一点:( – 2014-10-07 17:38:08