微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Poky 如何“包含”其他存储库?

如何解决Poky 如何“包含”其他存储库?

我读了几次(例如 here),Poky 是一个包含 OpenEmbedded、Bitbake 和其他内容的参考发行版。但我一直不确定“包含”的含义。现在我检查了,并且非常惊讶地发现 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: ... 提交是真正相同的 - 即使时间戳匹配到同一秒。 这到底是怎么工作的?

此外,将一个 repo 上的内容复制到另一个 repo 中是否违反了 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 可以添加一个指向任何其他git仓库的指针;没有必须匹配的标识符才能说明它们是相关的
  • git merge 有一个 --allow-unrelated-histories 标志,可让您组合两组没有任何共同历史记录的提交
  • git cherry-pickgit rebase 可以在其他一些历史记录之上重新创建提交中的更改,包括时间戳和提交者信息;有编辑提交消息的选项
  • git format-patchgit am 允许以与 git cherry-pickgit rebase 非常相似的方式导出和导入一系列补丁文件(最初用于通过 e-邮件)

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。