2017-04-13 56 views
0

commit對象我只是做了一些(不是我)回購git ls-tree,看到此輸出:混帳:在git的LS-樹輸出

100644 blob 54cfbdae80000000000000000000639faa8ecaee .gitignore 
100644 blob 7c6a8bf6500000000000000000000c84e3fba06d xxx.py 
040000 tree f9c9cf0760000000000000000000c6c48116bc14 yyy 
160000 commit 6f473ed0000000000000000000dffd4ebd48d103 zzz 
040000 tree fb81e98c40000000000000000000f90685a62410 vvv 
040000 tree 642e5f2e3000000000000000000063acd187d42d uuu 

zzz是空目錄。如果我刪除它,它會在git status輸出中顯示爲更改。 git status如果我觸摸其中的某些文件,則看不到任何內容。

什麼是zzz?那怎麼可能?

回答

1

雖然zzz項創建一個目錄,它是意味着代表目錄。看到這個的關鍵是將其typemode與其他目錄進行比較。 zzz的模式爲160000,其類型爲commit;最終存儲非空目錄的樹對象yyy,vvvuuu具有模式040000和類型tree

這意味着zzz條目是一個所謂的「gitlink」。

關聯的哈希ID(顯然你是上面提到的那些;它們有太多的零是巧合)是Git應該檢查到該目錄中的子模塊的哈希。 Git會將目錄本身作爲檢查這個超級項目的一部分。但是,稍後Git會讀取.gitmodules配置文件以找到合適的子項目URL:當您執行git submodule init時,它會將該存儲庫克隆到zzz目錄中。

如果您使用git clone --recursive進行克隆,您可以讓Git在超級項目的git clone期間自動執行此操作。詳情請參閱How to `git clone` including submodules?

又見Where does Git store the SHA1 of the commit for a submodule?

注意,如果沒有爲路徑沒有.gitmodules項,Git不會知道這裏克隆。 These "fake" entries may therefore be (ab)used to create empty directories. It sort-of works. There are no promises that it will keep working in later versions of Git, though, and in any case Git just kind of loses track of files within here, as it thinks they belong to another repository. Most of this paragraph is a link to the answer that describes this in detail.

+0

我甚至沒有考慮子模塊......雖然沒有'.gitmodules'。 –

+1

如果在任何地方沒有'.gitmodules'文件,Git將不知道要克隆什麼。這可能是某人讓Git創建一個空子目錄的訣竅 - 但它並不奏效,因爲Git堅持認爲它應該找到一個子模塊。請參閱[此答案](http://stackoverflow.com/a/8944077/1256452)。 – torek