一棵单树是如何用 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 对象类型之一——另外三种是 commit、blob 和 带注释的标记)。这样的对象存储
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 组织的?的主要内容,如果未能解决你的问题,请参考以下文章