我刚刚在某些(不是我的)回购中做了git ls-tree
并在输出中看到了这个:
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
?怎么会这样?
答案 0 :(得分:1)
虽然zzz
条目创建了一个目录,但不意味着代表空目录。看到这一点的关键是将其type
和mode
与其他目录进行比较。 zzz
的模式为160000
,其类型为commit
;最终存储非空目录的树对象yyy
,vvv
和uuu
具有模式040000
和类型tree
。
这意味着zzz
条目是所谓的“gitlink”。
相关的哈希ID(显然你是上面的那些;它们有太多的零重合)是Git应该检查到该目录的子模块的哈希值。 Git会将目录本身作为签出此超级项目的一部分。但是,稍后,Git将读取.gitmodules
配置文件以查找相应的子项目URL:当您执行zzz
时,它会将该存储库克隆到git submodule init
目录中。
如果您使用git clone
进行克隆,您可以让Git在超级项目的git clone --recursive
期间自动执行此操作。有关详细信息,请参阅How to `git clone` including submodules?。
另见Where does Git store the SHA1 of the commit for a submodule?