我正在学习Git,如果我有一个代表Git repo的数学结构的描述,那将会很棒。例如:它是一个有向无环图;它的节点代表提交;它的节点有标签(每个节点最多一个标签,没有标签使用两次),代表分支等等(我知道这个描述不正确,我只是想解释一下我在寻找什么。)
答案 0 :(得分:9)
除了Nevik Rehnel评论中的链接(根据请求复制到此处: eagain.net/articles/git-for-computer-scientists和gitolite.com/gcs)以及sehe's point that the commit graph forms a Merkle Tree,我会添加一些注释。
120000
(符号链接的文件模式),文件的“内容”实际上是符号链接目标。某些模式值是(ab)用于子模块,但我忘记了哪一个。 R和W模式位不存储,只存储X位(如果repo配置说忽略它们,它们甚至会被忽略)。git commit --allow-empty
它使用那棵空树。 (由于空树没有子对象,its SHA-1 hash value is a constant。)git gc
垃圾收集。空树似乎对收集免疫。 refs/
和logs/
目录中的任何内容以及文件packed-refs
(在.git
中,或用于裸回购或设置$GIT_DIR
时,无论在何处)都充当引用,特殊名称(HEAD
,ORIG_HEAD
等)也是如此;我不确定是否在.git
中创建并包含有效SHA-1的其他随机文件是否可以作为参考。git add
文件时,git会将文件放入对象存储区并将(非文本)SHA-1哈希放入索引文件中。这些是防止垃圾回收的有效引用。答案 1 :(得分:6)
我认为最相关的答案需要包括Git修订树的最重要特征:加密签名(每个修订包括父修订和提交详细信息的哈希)。
这被称为Merkle树:http://en.wikipedia.org/wiki/Merkle_tree
有关背景信息,请参阅前面的答案:(Git: How to treat commit so that versions of a file exist in their entirety (not just as diffs))
背景
存储deltas由RCS,CVS,Subversion和其他人(SourceSafe?)推广。主要是因为模型可以很容易地转换变更集,因为它们已经是delta形式。现代VCS-es(主要是分布式的)已经发展而已,并强调数据完整性。
数据完整性
由于对象数据库的设计,git非常强大,可以在快照或整个存储库中的任何位置检测到任何损坏的数据。有关Git存储库的加密属性的更多详细信息,请参阅此文章:Linus talk - Git vs. data corruption?
在techno babble中:提交历史形成加密强大的merkle树。当提示提交(HEAD)的sha1总和匹配时,它在数学上遵循
- 树内容
- 分支历史记录(包括所有签名和提交者/作者凭证)
是完全相同的。这是git(以及共享此设计功能的其他SCM)的巨大安全功能