对象目录在 git 克隆后没有对象

object directory has no objects after a git clone

在我对远程存储库进行 git 克隆之后,为什么 .git/objects 目录中没有任何以 sha1 的前两个字符开头的对象及其父目录hash(虽然它有信息和包目录)。在我自己提交之后,我才开始看到这些对象。 git log 如何在没有任何提交对象的情况下工作?

Git 可以将对象存储为 松散对象 ,在这种情况下,它们最终位于以第一个字节命名的这些目录之一中,或者作为 pack,以特殊的压缩格式存储对象。当松散物品过多时,git gc会自动运行打包。

当你进行克隆时,服务器会在一个包中为你提供你需要的所有对象,所以将这个包分解成松散的对象是没有意义的(除非数量非常少),所以Git 不会,只是将物品留在包中。

当您创建新对象时,它们通常被写为松散对象,因为创建高效包会产生一些开销,并且仅作为 git gc 的一部分变成包。

And how is git log able to work in this case without any of the commit objects?

您要查找的内容(位于 objects 目录中的哈希名称下的内容)是解压缩的 blob。但是 git log 不需要这些。它需要的是 info describes 树和 blob,这就是 info 目录对于.

但是,在git clone的时候,也没有info的内容。相反,git log 在包 index 中查找。你也可以! 运行 git verify-pack -v 与包 .idx 文件对比,看哪,有一个包含所有 blob 和树的列表,足以让 git log 回答您的查询。