提交是否以文件形式实现?

时间:2019-01-07 05:22:37

标签: git

在关系数据库系统中,表通常以文件的形式实现,或者数据库以文件的形式实现。

Git可以看作是一个数据库系统。 在Git中,什么实现为文件:blob,树,提交,存储库?谢谢。

2 个答案:

答案 0 :(得分:3)

Git存储库是文件的集合,“对象”是packfiles(压缩)或松散的(uncompressed)文件。
参见“ Git repository layout”:

Git Basics中所述:

  

您会在Git的所有位置看到这些哈希值,因为它使用了很多哈希值。实际上, Git并不是通过文件名而是通过其内容的哈希值将所有内容存储在数据库中

     

Git目录是Git存储项目的元数据和对象数据库的位置。这是Git最重要的部分,它是从另一台计算机克隆存储库时复制的内容。

     

工作树是项目一个版本的单个签出。这些文件将从Git目录中的压缩数据库中拉出,并放置在磁盘上,供您使用或修改。

注意:Git本身(commit e83c516)的第一提交提到:

  

有两种对象抽象:“对象数据库”和   “当前目录缓存”。

     

对象数据库实际上只是一个内容可寻址的集合   对象。
  所有对象均由其内容命名,该内容由对象本身的SHA1哈希近似。
  对象可以引用其他对象(通过引用其SHA1哈希),因此您可以建立对象的层次结构。

     

内容可寻址集合中有几种对象   数据库。它们都由zlib压缩,并以标签开始   类型,有关数据的大小信息。
  SHA1哈希始终是压缩的对象的哈希,而不是原始对象的哈希。

答案 1 :(得分:2)

  

Git可以看作是数据库系统...

这实际上是一个合理的高级视图。但是,当使用这种方法时,Git至少有两个键值存储(以及一些可选的其他附加值,我们将在此处忽略)。其中一个采用名称(Git称为引用),这些名称具有专门的形式(例如分支名称和标记名称),并将其转换为哈希ID值。另一个数据库使用哈希ID密钥并将其转换为对象。

提交实际上是类型为“ commit”的对象。每个提交都引用一个“树”类型的(单个)对象,该对象表示已保存的快照。该树依次引用其他子树和/或“ blob”对象,这些对象表示文件内容,或者对于符号链接,是链接的目标。

  

在Git中,实现为文件的是:blob,树,提交...

这里的答案是肯定和否定。与VonC said一样,这些都只是对象。有四种类型,这是到目前为止我们已经命名的三种,再加上“带注释的标签”。每个对象都存储为松散对象,在这种情况下,它存储在.git/objects/目录下的文件中,或者存储为打包对象。包文件存储在.git/objects/pack/中(至少,成对的文件:“包索引”和与该索引对应的内容)。一个文件包文件存储了许多对象,这些对象都采用了增量编码,因此可以通过部分提取其他对象的一部分来提取对象。

(打包文件的格式很复杂,并且有多个修订版本。)

松散对象的文件名是其哈希ID密钥,以十六进制表示,前两个字母与其余38个字母用/分隔符分隔,因此给定的哈希ID为{{1} }对象存储在1234567...中。

在相对少见的情况下,您可以将同一对象作为松散对象存储在一个或多个打包文件中。但是,由于对象的名称是其内容的哈希,因此所有副本都应匹配。当Git解压缩对象时,它会重新计算哈希,并仅当结果哈希与Git首先查找对象的键匹配时,才声明数据有效。否则,内容可能已损坏,可能是由于存储介质故障造成的。

(如果任何一个副本损坏了,您可以尝试所有其他副本,但是通常转到单独的克隆更容易。Git还将验证每个克隆操作上的哈希完整性。修复工具来尝试查找辅助副本,但是它确实具有爆炸单个打包文件的工具,因此您可以手动进行。)