Git:在git ls-tree输出中提交对象

时间:2017-04-13 22:03:47

标签: git

我刚刚在某些(不是我的)回购中做了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?怎么会这样?

1 个答案:

答案 0 :(得分:1)

虽然zzz条目创建了一个目录,但意味着代表目录。看到这一点的关键是将其typemode与其他目录进行比较。 zzz的模式为160000,其类型为commit;最终存储非空目录的树对象yyyvvvuuu具有模式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?

请注意,如果路径没有.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.