linux - 如何用 git 组织单树?

标签 linux git monorepo

我最近遇到了一个 article Greg Kroah-Hartman 讲述了为什么 Linux 内核没有稳定的 API 以及内核存储库是如何组织为单树的。当我与一位 friend 讨论这篇文章时,很明显我们对术语 tree 的应用有不同的理解:

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

在第一种情况下,贡献者不会检查整个项目,例如Linux Kernel,但只是一个子文件夹。然后可以将这些与例如结合起来。 git-subtree.

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

那么monotree中的tree指的是什么,一个项目如何用git组织成monotree呢?

最佳答案

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

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

您的问题相当于:作者所说的“主内核树”这个短语是什么意思?或者人们在提到树时通常是什么意思? em> 这些都是有效的问题,但与 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类型“树”的Git对象(存储在repository数据库中的四种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 月)事态的合理总结。

关于linux - 如何用 git 组织单树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48405637/

相关文章:

linux - sudo must be setuid root 错误

python - 服务器重启后守护进程的 PID 文件挂起

javascript - 带有来自 Typescript 的路径的 Monorepo 不起作用

git - 使用 Github 设置 Squarespace 开发者帐户

node.js - Heroku 部署错误上的 Webpack Node.js

angular - 在 NX monorepo angular 中运行 ionic 生成页面

GitOps - 在同一个仓库或单独的仓库中配置?

c - seccomp 系统调用陷阱函数中的指针返回值

linux - 如何在 Unix 中的嵌套循环中读取两个文件

Git 困惑 - 如何将本地更改恢复为最新的远程推送?