Git对象数据库似乎缺少blob对象

时间:2017-04-13 20:49:53

标签: git github version-control tree

基于this article from Git,解释了对象及其存储方式,我正在查看我们的git存储库对象,我认为gits存储的东西有点不同,或者不存储所有东西。

背景

根据文章,有treecommitblob等对象类型:

  1. blob只是一个文件。
  2. tree与容器对象类似,在其内容中,它具有引用子树或其他blob对象的SHA1哈希码。
  3. commit包含tree个引用以及有关作者,时间等的信息。
  4. 到目前为止一切顺利。

    我们的源代码

    我们的源代码包含数百个文件夹,数千个文件等。我们几乎将所有内容添加到源代码控制中。

    问题

    当我运行以下命令:find .git/objects -type f时,我得到以下结果:

    enter image description here

    它们是我能看到的唯一对象,其中包含committreeblobs

    让我们通过运行此命令git cat-file -p 04acc15d91xxxxxxxxxxxxxxxxxxxxxxxxxxxx来检查该列表中的示例对象的内容:

    enter image description here

    如果您喜欢所采用的tree对象内容中的类型,我们会看到它引用了三个tree对象和两个blob对象。如你所见,blob的名称以各种扩展名结尾,它们是我的源代码文件夹中的实际文件。

    但是在考虑我们拥有的文件数量时,对象的数量不匹配。它们在对象列表中的对象太少。 其他blob个对象在哪里?

    另外,当我在$ git cat-file -p e57531c55xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx对象上说blob时,我会得到与使用文本编辑器打开文件相同的内容,这是预期的:

    enter image description here

    这很好。虽然一切都按预期工作。然后,blob个对象的其余部分在哪里?

    另外,当我查看带有子树的树对象时,我看到了我在工作目录中看到的相同文件夹结构,这也是根据同一页面中的该段落所预期的:

      

    Git以类似于UNIX文件系统的方式存储内容,但有点   简化。 所有内容都存储为树和blob对象   树对应的UNIX目录条目和blob对应   或多或少的inode或文件内容。单个树对象包含   一个或多个树条目,每个树条目包含指向a的SHA-1指针   blob或子树及其关联的模式,类型和文件名。

    我觉得,在某些时候,git停止为文件夹创建树并将它们存储为大块?

1 个答案:

答案 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或类似物引用,并最终将被修剪。另一方面,如果你真的错过了提交,比如你错误地删除了一个分支,那么这些哈希可能会让你回复你的内容。