2014-10-07 80 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