代表Git回购的数学结构是什么
我正在学习Git,如果我有一个代表Git回购的数学结构的描述,那就太好了。例如:它是一个有向无环图;其节点表示提交;它的节点有表示分支的标签(每个节点最多一个标签,没有使用两次的标签),等等(我知道这个描述不正确,我只是想解释我在寻找什么。)除了Nevik Rehnel评论中的链接(根据请求复制到这里: (和),并且,我将添加一些注释代表Git回购的数学结构是什么,git,graph,Git,Graph,我正在学习Git,如果我有一个代表Git回购的数学结构的描述,那就太好了。例如:它是一个有向无环图;其节点表示提交;它的节点有表示分支的标签(每个节点最多一个标签,没有使用两次的标签),等等(我知道这个描述不正确,我只是想解释我在寻找什么。)除了Nevik Rehnel评论中的链接(根据请求复制到这里: (和),并且,我将添加一些注释 对象存储中有四种对象类型:提交、树、带注释的标记和blob(文件) 一个提交对象只包含一个树引用(当然可以指向更多的树)、父SHA-1哈希的可能空列表(必须是更
- 对象存储中有四种对象类型:提交、树、带注释的标记和blob(文件)
- 一个提交对象只包含一个树引用(当然可以指向更多的树)、父SHA-1哈希的可能空列表(必须是更多提交)、一个作者(姓名、电子邮件和时间戳)、一个提交者(与作者的形式相同)和提交文本
- 树对象包含重复0次或多次的(模式、子对象、文件名)列表。如果子对象是另一棵树,则文件名表示一个目录。如果它是一个blob,则表示一个文件。该模式看起来像POSIX文件模式,如果它是
(symlink的文件模式),则文件的“内容”实际上是symlink目标。某些模式值(ab)用于子模块,但我忘记了是哪个。不存储R和W模式位,只存储X位(即使这样,如果repo配置要求忽略它们,它们也会被忽略)120000
- 带注释的标记对象包含对象引用、标记器(名称、电子邮件和时间戳)和标记文本。被引用的对象通常是提交对象,但标记对象可以指向任何对象(甚至是另一个标记对象)
- 标签(分支、标记和reflog引用等)位于对象存储外部。对于带注释的标记,外部有一个标签,指向对象存储中带注释的标记对象。对于轻量级标记,外部标签直接指向提交
- 只有一个根提交没有限制。没有父级的任何提交都是根
- Git几乎从不生成空树(表示一个空目录),除了两种情况:在每个repo中始终有一个空树,如果您进行初始空提交(使用
),它将使用该空树。(由于空树没有子对象,)Git commit--allow empty
- “DAG”描述通常用于通过关闭提交父散列而形成的树。但是,树对象通常不应包含在其任何子树中,如果您设法创建循环树结构,您将无法检出它(因为它无限递归)。假设您不能用相同的校验和生成两个不同的树(如果可以的话,您可以破坏git),那么您将找不到一个树T1包含一个树T2,该树T2包含一个校验和为T1的不同树。因此,这些树也隐含着一个DAG,并且连接到提交DAG后,它们形成了一个更大的DAG.:-)李>
- 对象存储中未引用的对象将被
收集垃圾。空树似乎对收集免疫。git gc
和refs/
目录中的任何内容以及文件logs/
(在packeted refs
中,或对于裸回购,或在设置.git
时,无论在何处)都作为参考,特殊名称($git\u DIR
,HEAD
等)也作为参考;我不确定其他随机文件,如果在ORIG\u HEAD
中创建并包含有效的SHA-1,是否会用作引用.git
- 索引有一些我从未深入研究过的格式。它包含对对象存储中对象的引用。当您
git添加一个文件时,git会将该文件放入对象存储,并将(非文本)SHA-1散列放入索引文件中。这些是防止垃圾回收的有效引用
有关一些背景信息,请参见前面的答案:() 背景 RCS、CVS、Subversion等(SourceSafe?)都推广了存储delta。主要是因为模型使得转换变更集变得容易,因为它们已经是增量形式。现代VCS E(主要是分布式的)已经从这一点演变而来,并将重点放在数据完整性上 数据完整性 由于对象数据库的设计,git非常健壮,可以检测快照或整个repo中任何损坏的数据位。有关Git存储库的加密属性的更多详细信息,请参阅本文: 在techno babble中:提交历史形成加密的强merkle树。当tip commit(HEAD)的sha1和匹配时,数学上如下
- 树内容
- 分支机构历史记录(包括所有签准和提交人/作者凭据)
也许会有帮助;)不幸的是,我不知道还有其他更科学的文献。如果您发现更多信息,请随时发布您的问题的答案或评论,以让其他人知道。您可以作为答案转发吗?我只是想提高投票率,你把它改成了评论!!:)我认为这真的不值得一个答案,我目前没有时间用一个恰当的答案来总结或解释它——此外,@torek下面的答案在我看来做得很好;),如果是内存服务,我想如果你直接包含我第一次发布的链接,可能会对未来的读者有所帮助;)如果你知道关于你最后两个要点的任何两个小注释,可能会有更多的来源