Объедините два репозитория 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: также приятный маленький помощник и, кажется, лучше поддерживается.