Poky "contain" 其他存储库如何?

How does Poky "contain" other repositories?

我看了好几遍(例如here) that Poky is a reference distribution that contains OpenEmbedded, Bitbake and other things. But I was never sure about the meaning of "contains". Now I checked, and was very surprised to find out that the Poky repository字面上包含了其他几个仓库的内容。其中至少有:

似乎这些存储库被盲目地一起复制到另一个存储库中。但进一步挖掘,它们并没有被盲目复制。事实上,每个提交似乎总是完全相同地存在于两个回购协议中。示例:

me@home:~% cd poky               && git show 8877980c99 > x && cd ..
me@home:~% cd openembedded-core/ && git show 812eb3121e > x && cd ..
me@home:~% diff poky/x openembedded-core/x
1c1
< commit 8877980c99045d53c2465faeb45aa6e81f126708
---
> commit 812eb3121e0aabe4e3de9a8c61b1e62c87f55aa4
6,7d5
<
<     (From OE-Core rev: 812eb3121e0aabe4e3de9a8c61b1e62c87f55aa4)

除了提交散列和那一行 From OE-Core rev: ... 提交是真正相同的——甚至时间戳匹配到同一秒。 这到底是怎么回事?

此外,在违反 DRY 原则的意义上,将一个存储库中的内容复制到另一个存储库中不是一种不好的做法吗?每个提交者是否负责他的提交总是落在两个回购协议中?回购协议不会有分开的风险吗?事实上,我确实发现了一些(无关紧要的)文件,它们略有不同,比如这个:

me@home:~% diff poky/meta-poky/README.poky meta-yocto/meta-poky/README.poky
25c25
< DISTRO = "nodistro") and contains only emulated machine support.
---
> DISTRO = "") and contains only emulated machine support.

如评论中所述,存储库使用名为 combo-layer 的 Python 脚本从其他存储库导入更改,保留所有历史信息。

虽然经常与中央服务器一起使用,甚至像 GitHub 这样的托管服务,但 git 被明确设计为 去中心化 版本控制系统, 所以这种事情其实很容易做到:

  • git remote 可以添加指向 any 其他 git 存储库的指针;没有必须匹配的标识符才能表明它们是相关的
  • git merge 有一个 --allow-unrelated-histories 标志,可让您合并两组没有任何共同历史的提交
  • git cherry-pickgit rebase 可以在其他一些历史记录之上重新创建提交中的更改,包括时间戳和提交者信息;有编辑提交信息的选项
  • git format-patchgit am 允许以与 git cherry-pickgit rebase 非常相似的方式导出和导入一系列补丁文件(最初用于分发更改电子邮件)

所以在你的例子中,发生了这样的事情:

  1. 已获取 openembedded-core 的最新历史记录
  2. 发现提交 812eb3121e0aabe4e3de9a8c61b1e62c87f55aa4 自上次导入后是新的
  3. 为该提交生成了补丁文件
  4. 补丁已编辑,将行“(From OE-Core rev: 812eb3121e0aabe4e3de9a8c61b1e62c87f55aa4)”添加到提交消息
  5. 提交已合并到 poky 存储库中,保留其原始提交者信息

就 git 而言,这并不是特别神奇;它很乐意在您要求的任何地方应用提交。