我正在开发一个带有命名约定的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
之间有什么区别?
答案 0 :(得分:2)
如果没有--tags
,git 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}}中。因此,我并不确定你的意思是什么?"命名空间远程标签"在问题中。