Git仅获取" namespaced"远程标签?

时间:2014-10-07 16:25:17

标签: git

我正在开发一个带有命名约定的repo,用于将具有顶级分支命名空间的独立项目分开,例如:

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

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

当我为projectA配置我的本地git时如下:

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

我的期望是git-fetch manual关于默认行为的说法:指向从远程存储库下载的对象的标记被提取并存储在本地。

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

我完全糊涂了。有什么我做错了吗? "默认行为是什么"是git fetch有无--tags之间有什么区别?

1 个答案:

答案 0 :(得分:2)

如果没有--tagsgit fetch会逐字检查每个标记引用,以查看是否要获取其目标SHA-1。

整个fetch操作从本质上开始运行git ls-remote(尝试并查看它产生的内容)。然后,如果您尚未指定--tags,则它会遍历所有引用的列表(在builtin/fetch.c中名为find_non_local_tags的例程中。以refs/tags/开头的那些是标记,所以它继续查看这些标签是否引用了将被提取的对象。如果要提取该对象,则将标签添加到要更新的引用列表中。

但是,对于--tags,相同的代码只会将tag_refspec添加到要获取的ref-specs中。这在remote.c中定义,基本上是refs/tags/*:refs/tags/*的预解析形式。

请注意,在整个过程中,标签只是"以文字前缀refs/tags/"开头的引用。没有"命名空间标记&#34 ;:标记名称空间是以refs/tags/开头的整个名称范围。 git称之为"远程分支"或者"远程跟踪分支" do 具有单独的子名称空间:它们全部位于refs/remotes/中,但远程origin的内容专门保存在refs/remotes/origin/中,而远程bob则保留在refs/remotes/bob中。 1}}在{{1}}中。因此,我并不确定你的意思是什么?"命名空间远程标签"在问题中。

相关问题