Могу ли я использовать разделение поддерева 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 много коммитов, и на раскол действительно требуется час для запуска. Я могу дать вам подробную информацию о том, как помочь с этим, если вам это нужно. (Просто комментируйте, и я обновлю этот ответ).