一棵单树是如何用 git 组织的?

Posted

技术标签:

【中文标题】一棵单树是如何用 git 组织的?【英文标题】:How is a monotree organized with git? 【发布时间】:2018-07-02 12:05:57 【问题描述】:

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

    tree 指的是项目的不同子文件夹。 指的是git master分支的不同fork。

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

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

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

【问题讨论】:

第一种情况更正确,但存储库的根文件夹也被跟踪为树。运行git log -1 <commit> --pretty=raw,您可以看到提交的根树。它有一个像提交一样的哈希名称。运行git ls-tree <treeid>,你可以看到这棵树有什么。它可以有 blob、树和提交。带有文件名的 Blob 代表文件。带有文件夹名称的树代表 foders。提交代表子模块。它们是您可以在根文件夹中看到的内容。子文件夹有什么?然后运行git ls-tree <subtree-id>。您可以添加-r -t 以查看全貌。 谢谢。这让事情有点清楚了。我应该多研究一下 git 的架构。 【参考方案1】:

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

短语monotree,甚至是部分词mono,从未出现在the referenced article中。 这篇文章中有七次出现tree这个词。 在这七次出现中的六次中,这里的整个短语是主内核树。没有使用这个完整短语的一个参考只是说,但显然与其他六个具有相同的意图。 您已使用 git linux monorepo 标记此内容(以防标签更改)。

您的问题是:作者所说的“主内核树”是什么意思?人们在提到树时通常是什么意思? em> 这些都是有效的问题,但与 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 中的 tree 对象 特指 Git 类型“树”的存储 Git 对象(存储在存储库数据库中的四种 Git 对象类型之一——另外三种是 commitblob带注释的标记)。这样的对象存储 三元组,其中 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 月)的事态的合理总结。

【讨论】:

感谢您的详尽回答。我的问题不够清楚。我确实知道计算机科学中的树是什么。然而,当我读到 The Kernel 存储库被组织成单树时,我想知道他们的意思是什么。 @ElpieKay 的评论让我更清楚。

以上是关于一棵单树是如何用 git 组织的?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Dojo 组织异步代码?

如何用 redux 和 react-router 组织状态?

JavaScript--数据结构与算法之二叉树

用于可扩展项目的 graphql 代码组织

git提交到组织以及分支合并

组织多个 scala 相互关联的 sbt 和 git 项目 - 最佳实践建议