0

我最近看到Greg Kroah-Hartman的一篇文章,关于为什么 Linux 内核没有稳定的 API 以及内核存储库是如何组织成单树的。当我和一位朋友讨论这篇文章时,很明显我们对这个词的含义有了不同的理解tree

  1. tree指项目的不同子文件夹。
  2. 它指的是 git master 分支的不同分支。

在第一种情况下,贡献者不会签出完整的项目,例如 Linux 内核,而只会签出一个子文件夹。然后可以将这些与例如git-subtree.

在第二种情况下,贡献者必须检查整个项目并基本上创建一个 monorepo 的分支。

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

4

1 回答 1

3

让我们在这里做一些笔记:

  • 短语monotree,甚至是部分单词mono,从未出现在引用的文章中
  • 文章中出现了 7 处单词tree
  • 在这七次出现中的六次中,这里的整个短语是主内核树。没有使用这个完整短语的一个参考只是说,但显然与其他六个具有相同的意图。
  • 你已经用 标记了它(以防标签改变)。

您的问题相当于:作者所说的“主内核树”是什么意思?或者当人们提到一棵树时,他们通常是什么意思? 这些都是有效的问题,但与 Git 并不特别相关。

计算机科学中的树往往指的是数据结构,它的定义也很松散;请参阅维基百科条目。我们有一些节点和边的集合——在数学上,一个图G由它的一组顶点V和边E定义,其中每个顶点通过边连接到其他顶点——并且图上有约束,因此它是最小连接的,或者等效地,最大无环。(参见https://en.wikiversity.org/wiki/Introduction_to_graph_theory/Proof_of_Theorem_4以及数据结构 Tree 和 Graph 有什么区别的答案? )

Git 中的树对象特指存储的 Git 类型“树”的 Git 对象(存储在存储库数据库中的四种 Git 对象类型之一——其他三种是commitblobannotated tag)。这样的对象存储 <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 文章的链接,该文章似乎是对撰写本文时(2016 年 8 月)时事态的合理总结。

于 2018-01-23T18:22:58.940 回答