Объедините два репозитория git с историей в подкаталоги и сделайте вид, что файлы всегда есть

Мне нужно объединить два репозитория git в один новый репозиторий без потери истории и сохранения веток и тегов функций.

Это кажется довольно распространенным вопросом, который уже решался много раз (например, https://github.com/unravelin/tomono или Merge два репозитория Git без нарушения истории файлов).

Но что ни одно из решений не удалось решить, так это то, что я могу вернуться назад во времени и просмотреть все файлы из указанного коммита, где присутствуют оба подкаталога.

Поэтому мне интересно, возможно ли что-то подобное с git.

Это моя текущая установка: два репозитория, которые были разработаны отдельно:

  • apprepo
  • librepo

Они оба клонируются и объединяются в rpm нашей системой сборки (включая некоторые config и каталоги данных)

  • / app / -> от apprepo
  • / lib / -> из librepo
  • /данные/
  • / Config /

Теперь я хочу перенести оба репозитория в одно "монорепо", где я мог бы также хранить конфигурацию и другие основные необходимые подкаталоги.

Если я использую одно из множества решений "объединить х репозитории в один репозиторий", я получу одно из двух состояний при просмотре дерева каталогов этого коммита:

  • Файлы, которые не были перемещены в истории - Подтвердить в apprepo: только файлы, которые были в apprepo, видны и отображаются в корневом каталоге. Фиксация в librepo: только файлы, которые были в apprepo, видны и отображаются в корневом каталоге
  • Файлы, перемещенные в истории - Подтвердить в apprepo: видны только приложения subdir со всеми файлами, которые были в apprepo. При фиксации в librepo показывается только subdir lib со всеми файлами, которые были в librepo.

Это также делает теги бесполезными. Я хотел бы, чтобы приложение и библиотека были видны при любом коммите.

Давным-давно, при переходе с SVN на git, я справился с чем-то подобным, прочитав обе истории и "воспроизведя" коммиты, как если бы подкаталоги были всегда там.

Есть ли способ решить эту конкретную проблему, или мне действительно приходится жить с потерянными тегами и "неполной" историей?

1 ответ

TLDR; После еще одного полного дня, проведенного на эту тему, я согласился с решением с наименьшими недостатками. Комбинация стратегии subtree-merge из /questions/11031720/obedinit-dva-repozitoriya-git-ne-narushaya-istoriyu-fajlov/11031726#11031726 и ветки git filter из /questions/11031720/obedinit-dva-repozitoriya-git-ne-narushaya-istoriyu-fajlov/11031738#11031738

Возможно, следующие инструменты помогут другим:

  • https://metacpan.org/pod/git-stitch-repo: Большие надежды на это сработали, но наши репозитории казались слишком сложными для алгоритма обработки ветвей / слияний. Я закончил со слишком большим количеством пропущенных коммитов. Может быть, с более линейными репозиториями это может работать
  • https://github.com/shopsys/monorepo-tools: также приятный маленький помощник и, кажется, лучше поддерживается.
Другие вопросы по тегам