git如何存储关于树和blob

时间:2017-03-14 16:29:24

标签: git

当有人提交时,如何为该提交布置树对象和blob对象?

实施例

假设我有一个如下所示的树结构

.  
|____dir1  
| |____file_dir1  
| |____newdir  
| | |____file_newdir  
|____dir2  
| |____file_dir2  
|____file1  
|____file2  
|____file3  

根据this,它将为树结构中存在的每个文件创建一个blob。该链接还告诉我们除了创建一个blob之外,它还会创建一个树对象。

现在出现的问题是创建单个树对象还是多个树对象。让我们说多个然后直觉它可能为上面的项目结构每次提交创建3个树对象,因为项目结构中有三个目录,每个树对象将指向每个blob对象(注意每个blob对应到存储库中的每个文件。)

现在,如果每个blob对应于每个文件,那么为什么它不被称为文件?为什么blob?

问题

  • 创建了多少个树对象?一个还是多个?如果是,那么提交中的树对象究竟是什么?
  • 如果是多个,则根据我上面解释的类比或其他方式创建。如果它根据我的类比创建,那么它只是在某个时刻创建项目结构的副本。那么它是否为一个承诺大约几千个的简单项目占用了太多磁盘空间呢?
  • 有另一个术语blob的原因是什么,为什么不在文件中存储有关文件的信息。
  • 您对磁盘空间消耗的看法是什么,git是高效的还是其他DVCS(如mercurial,...)

1 个答案:

答案 0 :(得分:2)

  • 每个目录有一棵树 - 提交中的树对象是根目录,它包含指向blob和其他树的指针。
  • 如果没有改变,
  • git会重用blob / trees。它也会在某些时候提供gc,这意味着(除其他外)它将压缩blob并存储差异而不是整个blob
  • A "blob" object is nothing but a chunk of binary data. - 文件有文件名,许多不同的相同文件可能引用相同的blob
  • 如上所述,git会将blob重用于相同的文件,并在某些时候将blob(松散的对象)压缩到Packfiles(blob用zlib压缩开始) - git非常有效(以高效率构建(空间和时间)mind

另见Computer Scientists的Git和评论中引用的chapter 10