Как в Poky есть другие репозитории?

Я пару раз читал (например, здесь), что Poky - это эталонный дистрибутив, который содержит OpenEmbedded, Bitbake и другие вещи. Но я никогда не был уверен в значении «содержит». Теперь я проверил и был очень удивлен, обнаружив, что репозиторий Poky буквально содержит содержимое нескольких других репозиториев. Среди них минимум:

Кажется, что эти репозитории были слепо скопированы вместе в другое репо. Но если копать дальше, они не копировались вслепую. Фактически, кажется, что каждая фиксация всегда существует идентично в обоих репозиториях. Пример:

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.

person Georg P.    schedule 08.01.2021    source источник
comment
Ваш актуальный вопрос выделен здесь жирным шрифтом? Потому что здесь есть некоторые вопросы, которые активно спрашивают мнения людей, и это на самом деле не по теме здесь, в Stack Overflow.   -  person Lasse V. Karlsen    schedule 08.01.2021
comment
Я предполагаю, что это ответ на вопрос, как это вообще работает? заключается в том, что сопровождающий poky создал сценарий, который дублирует все коммиты в этот репозиторий, воспроизводя изменения или что-то в этом роде. Если бы все они были просто добавлены как отдельные истории в этот репозиторий, а затем объединены как несвязанные истории, вы бы также увидели идентичные хэши фиксации.   -  person Lasse V. Karlsen    schedule 08.01.2021
comment
Да, меня больше всего интересует выделенный жирным шрифтом текст. Я подумал, что, возможно, существует какая-то git-magic, о которой я никогда не слышал (выбор вишенки между репозиториями или что-то в этом роде ...). Если подумать, это, возможно, вопрос, связанный с git.   -  person Georg P.    schedule 08.01.2021


Ответы (1)


Как отмечено в комментариях, репозиторий использует скрипт Python под названием combo-layer для импорта изменений из других репозиториев с сохранением всей их исторической информации.

Хотя git часто используется с центральным сервером или даже с хостинг-сервисом, например GitHub, он явно разработан как децентрализованная система управления версиями, поэтому на самом деле это довольно легко сделать:

  • git remote может добавить указатель на любой другой репозиторий git; нет идентификатора, который должен совпадать, чтобы сказать, что они связаны
  • git merge имеет --allow-unrelated-histories флаг, который позволяет объединить два набора коммитов, не имеющих общей истории
  • git cherry-pick и git rebase могут воссоздавать изменения в фиксации поверх некоторой другой истории, включая метку времени и информацию о коммиттере; есть варианты редактирования сообщения коммита
  • git format-patch и git am позволяют экспортировать и импортировать серию файлов исправлений способом, очень похожим на git cherry-pick или git rebase (изначально использовались для рассылки изменений по электронной почте)

Итак, в вашем примере произошло что-то вроде этого:

  1. Получена последняя история с openembedded-core
  2. Фиксация 812eb3121e0aabe4e3de9a8c61b1e62c87f55aa4 оказалась новой с момента последнего импорта
  3. Для этого коммита был сгенерирован файл патча.
  4. Патч был отредактирован, чтобы добавить строку (From OE-Core rev: 812eb3121e0aabe4e3de9a8c61b1e62c87f55aa4) в сообщение фиксации
  5. Фиксация была объединена с репозиторием poky с сохранением исходной информации о коммиттере.

Что касается git, в этом нет особой магии; он с радостью применяет коммиты, куда бы вы его ни попросили.

person IMSoP    schedule 08.01.2021
comment
Благодаря вашим указателям я нашел эту страницу вики, которая прекрасно это объясняет. Здесь также есть ответ на Почему бы не использовать другие подобные инструменты (репо, подмодули, поддерево)?. - person Georg P.; 08.01.2021