Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
代表Git回购的数学结构是什么_Git_Graph - Fatal编程技术网

代表Git回购的数学结构是什么

代表Git回购的数学结构是什么,git,graph,Git,Graph,我正在学习Git,如果我有一个代表Git回购的数学结构的描述,那就太好了。例如:它是一个有向无环图;其节点表示提交;它的节点有表示分支的标签(每个节点最多一个标签,没有使用两次的标签),等等(我知道这个描述不正确,我只是想解释我在寻找什么。)除了Nevik Rehnel评论中的链接(根据请求复制到这里: (和),并且,我将添加一些注释 对象存储中有四种对象类型:提交、树、带注释的标记和blob(文件) 一个提交对象只包含一个树引用(当然可以指向更多的树)、父SHA-1哈希的可能空列表(必须是更

我正在学习Git,如果我有一个代表Git回购的数学结构的描述,那就太好了。例如:它是一个有向无环图;其节点表示提交;它的节点有表示分支的标签(每个节点最多一个标签,没有使用两次的标签),等等(我知道这个描述不正确,我只是想解释我在寻找什么。)

除了Nevik Rehnel评论中的链接(根据请求复制到这里: (和),并且,我将添加一些注释

  • 对象存储中有四种对象类型:提交、树、带注释的标记和blob(文件)
  • 一个提交对象只包含一个树引用(当然可以指向更多的树)、父SHA-1哈希的可能空列表(必须是更多提交)、一个作者(姓名、电子邮件和时间戳)、一个提交者(与作者的形式相同)和提交文本
  • 树对象包含重复0次或多次的(模式、子对象、文件名)列表。如果子对象是另一棵树,则文件名表示一个目录。如果它是一个blob,则表示一个文件。该模式看起来像POSIX文件模式,如果它是
    120000
    (symlink的文件模式),则文件的“内容”实际上是symlink目标。某些模式值(ab)用于子模块,但我忘记了是哪个。不存储R和W模式位,只存储X位(即使这样,如果repo配置要求忽略它们,它们也会被忽略)
  • 带注释的标记对象包含对象引用、标记器(名称、电子邮件和时间戳)和标记文本。被引用的对象通常是提交对象,但标记对象可以指向任何对象(甚至是另一个标记对象)
  • 标签(分支、标记和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
    等)也作为参考;我不确定其他随机文件,如果在
    .git
    中创建并包含有效的SHA-1,是否会用作引用

  • 索引有一些我从未深入研究过的格式。它包含对对象存储中对象的引用。当您
    git添加一个文件时,git会将该文件放入对象存储,并将(非文本)SHA-1散列放入索引文件中。这些是防止垃圾回收的有效引用

我认为最相关的答案需要包括Git修订树最重要的特征:加密签名(每个修订都包括父修订的哈希和提交细节)

这被称为Merkle树:


有关一些背景信息,请参见前面的答案:()

背景 RCS、CVS、Subversion等(SourceSafe?)都推广了存储delta。主要是因为模型使得转换变更集变得容易,因为它们已经是增量形式。现代VCS E(主要是分布式的)已经从这一点演变而来,并将重点放在数据完整性上

数据完整性 由于对象数据库的设计,git非常健壮,可以检测快照或整个repo中任何损坏的数据位。有关Git存储库的加密属性的更多详细信息,请参阅本文:

在techno babble中:提交历史形成加密的强merkle树。当tip commit(HEAD)的sha1和匹配时,数学上如下

  • 树内容
  • 分支机构历史记录(包括所有签准和提交人/作者凭据)
都是一样的。这是git(以及其他共享此设计特性的SCM)的一个巨大安全特性


也许会有帮助;)不幸的是,我不知道还有其他更科学的文献。如果您发现更多信息,请随时发布您的问题的答案或评论,以让其他人知道。您可以作为答案转发吗?我只是想提高投票率,你把它改成了评论!!:)我认为这真的不值得一个答案,我目前没有时间用一个恰当的答案来总结或解释它——此外,@torek下面的答案在我看来做得很好;),如果是内存服务,我想如果你直接包含我第一次发布的链接,可能会对未来的读者有所帮助;)如果你知道关于你最后两个要点的任何两个小注释,可能会有更多的来源