Могу ли я использовать разделение поддерева git для поддержки "fork" подкаталога проекта?

Короче говоря, я хочу "переделать" подкаталог другого проекта (не под моим контролем) на верхний уровень нового репозитория и делать улучшения кода в этом подкаталоге, сохраняя при этом возможность слияния изменений из подкаталога в восходящий проект.

Я читал эту тему на некоторое время, но не могу найти верный ответ для моей ситуации. Большинство применений git subtree разбиваются на эти случаи:

  • Подкаталог проекта выделяется как отдельный проект. Основной проект полностью удаляет этот подкаталог, и новый проект живет своей жизнью.
  • Сопровождающий родительского проекта хочет разрешить ведение подкаталога на своих собственных условиях и выворачивает его в свой собственный репозиторий, который добавляется обратно в основной проект с использованием git subtree add

Эти варианты использования не относятся ко мне: я не разблокирую и забываю, и у меня нет сторонних сторон этой вилки, поэтому git subtree add потока git subtree add неприменимо.

Итак, скажем, исходный модуль живет в contrib/foo в основном проекте. Моя нынешняя идея:

  • Используйте git subtree split -P contrib/foo -b upstream_vx.y чтобы создать новую историю, которая "подталкивает" подкаталог до верхнего уровня хранилища
  • Создайте master ветку из моего проекта с улучшениями с этого момента
  • Продолжайте обновлять upstream_vx.y, периодически запуская git subtree split
  • Когда мне нужно исправление ошибки или еще что-то от восходящего потока, слейте upstream_vx.y в мой master

Это не кажется мне "git-like". В частности, я в основном создаю параллельную историю подкаталога восходящего проекта и поддерживаю свою собственную "поднятую" ветвь для каждой основной ветки вверх (не говоря уже о возможности ссылаться на теги вверх по течению).

Есть ли лучший способ сделать это?

Ответ 1

Кажется, я поддерживаю подобную ситуацию. У меня есть основной проект (ProjA), который имеет модули, и я добавляю поддерево второго проекта (ProjB) в первичные модули. Для этого я поддерживаю копию ProjB.

Split ProjB:

cd ProjB
git checkout -b split-maint
git subtree split --prefix=important/dir --branch=module-for-A 

Добавьте поддерево в ProjA:

cd ProjA
git remote add ProjB_remote /path/to/ProjB
git fetch ProjB_remote
git subtree add --prefix=modules/projB_mod ProjB_remote/module-for-A --message="commit message"

Затем, чтобы обновить/сохранить, повторно разбить оригинал (как указано выше). Ключевым моментом здесь является разделение разделов git, которое повторяется, и SHA каждой ревизии, которая была ранее разделена, будет одинаковой.

Обновите ProjA новыми сведениями:

cd ProjA
git fetch ProjB_remote
git subtree merge --prefix=modules/projB_mod ProjB_remote/module-for-A --message="commit message"

Технически я делаю это немного по-другому, потому что у моего ProjB много коммитов, и на раскол действительно требуется час для запуска. Я могу дать вам подробную информацию о том, как помочь с этим, если вам это нужно. (Просто комментируйте, и я обновлю этот ответ).