首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >commit是作为文件实现的吗?

commit是作为文件实现的吗?
EN

Stack Overflow用户
提问于 2019-01-07 13:22:37
回答 2查看 73关注 0票数 0

在关系数据库系统中,表通常被实现为文件,或者很少情况下数据库被实现为文件。

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

EN

回答 2

Stack Overflow用户

发布于 2019-01-07 13:29:20

Git存储库是一个文件集合,其中的“对象”是包文件(压缩的)或松散的(未压缩的文件)。

参见"Git repository layout":

Git Basics中所述

你会看到这些散列值在

中随处可见,因为它用得太多了。事实上,Git在其数据库中存储的所有内容不是通过文件名,而是通过其内容的哈希值。

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

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

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

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

从字面上看,对象数据库只是一个内容可寻址的对象集合。

所有对象都按其内容命名,该内容由对象本身的SHA1散列近似表示。

对象可以引用其他对象(通过引用它们的SHA1散列),因此您可以构建对象的层次结构。

在内容寻址集合数据库中有几种类型的对象。它们都是用zlib压缩的,并以其类型的标记和有关数据的大小信息开始。

SHA1散列始终是压缩对象的散列,而不是原始对象。

票数 3
EN

Stack Overflow用户

发布于 2019-01-07 14:21:36

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

这实际上是一个合理的高级视图。然而,在使用这种方法时,Git至少有两个键值存储(以及一些可选的附加存储,我们在这里将忽略它们)。一种是名字-- Git称之为引用,它有专门的形式,比如分支和标记名--并将它们转换成散列ID值。另一个数据库获取散列ID键并将其转换为对象。

从字面上看,提交是一个“提交”类型的对象。每次提交都会引用一个"tree“类型的(单个)对象,该对象表示保存的快照。该树依次引用附加的子树和/或表示文件内容的"blob“对象,或者对于符号链接,引用该链接的目标。

中,实现为文件的是什么: blob、树、提交……

这里的答案既是肯定的,也是否定的。作为VonC said,这些都只是对象。有四种类型,这是我们到目前为止命名的三种类型,加上“带注释的标签”。每个对象要么存储为松散对象(在这种情况下,它位于.git/objects/目录下的文件中),要么存储为压缩对象。包文件存储在.git/objects/pack/中(至少是成对的文件:一个“包索引”,以及对应于该索引的内容)。一个包文件存储许多对象,使用增量编码,以便可以通过部分提取其他对象的部分来提取对象。

(包文件的格式很复杂,已经有了几次修订。)

松散对象的文件名是它的散列ID键,用十六进制表示,前两个字母用/分隔符从其余的38个字母中分离出来,因此给定散列ID 1234567...,该对象存储在.git/objects/12/34567...中。

在相对较少的情况下,您可以将同一对象存储为松散对象,并将其存储在一个或多个包文件中。但是,由于对象的名称是其内容的散列,因此所有副本都应该匹配。当Git解压缩一个对象时,它会在运行过程中重新计算散列,并且当且仅当产生的散列与Git最初查找对象时所使用的键匹配时,才会声明数据有效。否则,内容已被损坏,可能是由于存储介质故障。

(如果任何一个副本被损坏,您可以尝试所有其他副本,但通常情况下,只使用单独的克隆会更容易。Git还将验证每个克隆操作的哈希完整性。Git没有提供花哨的修复工具来尝试定位第二个副本,但它确实有工具来分解单独的包文件,所以你可以手动完成。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54068909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档