如何用git组织monotree?

时间:2018-01-23 15:45:23

标签: linux git monorepo

我最近遇到了Greg Kroah-Hartman article关于为什么Linux Kernel没有稳定的API以及内核存储库如何组织为单一树的问题。当我和朋友讨论这篇文章时,很明显我们对术语tree适用的内容有了不同的理解:

  1. tree指的是项目的不同子文件夹。
  2. 它指的是git master分支的不同分支。
  3. 在第一种情况下,贡献者不会检查整个项目,例如Linux内核,但只有一个子文件夹。这些可以与例如git-subtree

    在第二种情况下,贡献者必须签出整个项目并基本上创建一个单一的分叉。

    那么montree中的tree是指什么,以及如何将项目组织为git的monotree?

1 个答案:

答案 0 :(得分:3)

我们在这里做几点说明:

  • 短语 monotree ,甚至是部分词 mono ,永远不会出现在the referenced article中。
  • 该文章有七次出现 tree
  • 在这七次出现中的六次中,这里的整个短语是主内核树。不使用此完整短语的一个引用只是说但显然与其他六个具有相同的意图。
  • 您已使用 对此进行了标记(如果代码发生变化)。

你的问题相当于:作者用“主要内核树”这个词来表示什么?人们在提到树时一般意味着什么?这些是有效的问题,但与Git没有特别的关系。

计算机科学中的

倾向于引用数据结构,这也是非常松散的定义;见the wikipedia entry。我们有一些节点和边缘的集合 - 数学上,图形 G 由其顶点 V 和边 E 定义,其中每个顶点连接通过边缘到其他顶点 - 并且图形上存在约束,使得最小连接,或等效地,最大非循环。 (请参阅https://en.wikiversity.org/wiki/Introduction_to_graph_theory/Proof_of_Theorem_4What's the difference between the data structure Tree and Graph?的答案)

Git中的树对象特指Git-type“tree”存储的Git对象(存储在数据库数据库中的四种Git对象类型之一 - 其他三个是提交 blob 带注释的标记)。这样的对象存储< mode,name,hash-ID>三元组,其中mode和hash-ID标识要与名称关联的其他Git对象,这是一个任意的 1 字节串,不包括NUL和斜杠(分别代码0和0x2f或47)。存储在Git中的提交对象包括单个树对象的哈希ID。读取树对象并找到它列出的子对象,然后递归地读取它们自己的子对象(如果这些对象是树),导致构造最小连接的图形,即CS样式的树。

1 由于缓存条目ce_namelen字段存在长度限制,该字段具有32位整数类型。因此,名称组件的长度不得超过4 GB。实际上,没有人应该超过255个字节,但据我所知,Git中的树对象不会强制执行任何特定的限制。

Linux中的文件系统树实际上只是一个标识文件系统中实体的字符串,虽然命名除目录之外的任何内容都会导致只有一个节点的退化树。但是,通过命名目录,您可以暗示解释此字符串的任何人都应该读取目录的内容,这些内容是(通过与标识目录本身的字符串连接在一起的名称)命名另一个Linux文件系统树,可能是一个退化的文件系统树。单个文件或设备节点或其他。这种递归枚举导致构建一个最小连接的图形,就像使用Git树对象一样。 (也许不出所料,Linux目录对象对名称的约束与Git树对象基本相同,但它们通常具有小得多的最大组件名称长度,通常为255个字节或更少。)

最后,文章中使用的短语主内核树的方式是指Linux内核库--Linus Torvald的Linux内核的Git存储库 - 以及它周围的整个生态系统。关于细节的争论还有很大的空间。在这里,我将只包含一个指向此特定InfoWorld article的链接,这似乎是截至撰写时(2016年8月)的事态的合理摘要。