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