我最近遇到了Greg Kroah-Hartman article关于为什么Linux Kernel没有稳定的API以及内核存储库如何组织为单一树的问题。当我和朋友讨论这篇文章时,很明显我们对术语tree
适用的内容有了不同的理解:
tree
指的是项目的不同子文件夹。在第一种情况下,贡献者不会检查整个项目,例如Linux内核,但只有一个子文件夹。这些可以与例如git-subtree
。
在第二种情况下,贡献者必须签出整个项目并基本上创建一个单一的分叉。
那么montree中的tree
是指什么,以及如何将项目组织为git的monotree?
答案 0 :(得分:3)
我们在这里做几点说明:
你的问题相当于:作者用“主要内核树”这个词来表示什么?或人们在提到树时一般意味着什么?这些是有效的问题,但与Git没有特别的关系。
计算机科学中的树倾向于引用数据结构,这也是非常松散的定义;见the wikipedia entry。我们有一些节点和边缘的集合 - 数学上,图形 G 由其顶点 V 和边 E 定义,其中每个顶点连接通过边缘到其他顶点 - 并且图形上存在约束,使得最小连接,或等效地,最大非循环。 (请参阅https://en.wikiversity.org/wiki/Introduction_to_graph_theory/Proof_of_Theorem_4和What'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月)的事态的合理摘要。