基于this article from Git,解释了对象及其存储方式,我正在查看我们的git存储库对象,我认为gits存储的东西有点不同,或者不存储所有东西。
根据文章,有tree
,commit
和blob
等对象类型:
blob
只是一个文件。tree
与容器对象类似,在其内容中,它具有引用子树或其他blob对象的SHA1哈希码。commit
包含tree
个引用以及有关作者,时间等的信息。到目前为止一切顺利。
我们的源代码包含数百个文件夹,数千个文件等。我们几乎将所有内容添加到源代码控制中。
当我运行以下命令:find .git/objects -type f
时,我得到以下结果:
它们是我能看到的唯一对象,其中包含commit
,tree
和blobs
。
让我们通过运行此命令git cat-file -p 04acc15d91xxxxxxxxxxxxxxxxxxxxxxxxxxxx
来检查该列表中的示例对象的内容:
如果您喜欢所采用的tree
对象内容中的类型,我们会看到它引用了三个tree
对象和两个blob
对象。如你所见,blob的名称以各种扩展名结尾,它们是我的源代码文件夹中的实际文件。
但是在考虑我们拥有的文件数量时,对象的数量不匹配。它们在对象列表中的对象太少。 其他blob
个对象在哪里?
另外,当我在$ git cat-file -p e57531c55xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
对象上说blob
时,我会得到与使用文本编辑器打开文件相同的内容,这是预期的:
这很好。虽然一切都按预期工作。然后,blob
个对象的其余部分在哪里?
另外,当我查看带有子树的树对象时,我看到了我在工作目录中看到的相同文件夹结构,这也是根据同一页面中的该段落所预期的:
Git以类似于UNIX文件系统的方式存储内容,但有点 简化。 所有内容都存储为树和blob对象 树对应的UNIX目录条目和blob对应 或多或少的inode或文件内容。单个树对象包含 一个或多个树条目,每个树条目包含指向a的SHA-1指针 blob或子树及其关联的模式,类型和文件名。
我觉得,在某些时候,git停止为文件夹创建树并将它们存储为大块?
答案 0 :(得分:2)
你觉得磁盘上缺少git对象文件的原因是你是对的,错的。
他们不再作为单独的文件在磁盘上,但已合并到一个包文件中。
所以他们在磁盘上,他们只是不在单独的文件中。
您可以在最顶层屏幕截图的底部看到此包文件。包文件是.pack
文件以及包{{p>}的索引{。}}。
您可以通过执行以下命令查看包文件:
.idx
这应列出如下内容:
git verify-pack -v .git/objects/pack/pack-SHA-OF-PACK.pack
(此知识和上面的示例列表取自此页面:Unpacking Git packfiles)
那么,如果您真的认为您的存储库被堵塞了怎么办?它真的丢失了文件吗?那么你会要求git用这个来验证你的git存储库的结构和内容:
200c8213bd227eed106fed7b168ac3dfd5257cc3 commit 263 184 12
b8043e69c7af9925e3a52500ab26cc743ff5ef5f commit 458 293 196
...
non delta: 311 objects
chain length = 1: 194 objects
...
.git\objects\pack\pack-SHA....pack: ok
这将输出如下内容:
git fsck
请注意,如果您删除了分支,重新定位或完成了其他历史记录重写命令,您可能会看到这样的行:
$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (890/890), done.
这是良性,因为它们不再被任何分支,标签,HEAD或类似物引用,并最终将被修剪。另一方面,如果你真的错过了提交,比如你错误地删除了一个分支,那么这些哈希可能会让你回复你的内容。