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

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

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

  • Подкаталог проекта выделяется как отдельный проект. Родительский проект полностью удаляет подкаталог, а новый проект живет своей жизнью.
  • Сопровождающий родительского проекта хочет разрешить обслуживание подкаталога на своих условиях и выделяет его в свой собственный репозиторий, который добавляется обратно в основной проект с помощью 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

Мне это не кажется "мерзавцем". В частности, я в основном создаю параллельную историю подкаталога восходящего проекта и поддерживаю свою собственную «поднятую» ветку для каждой основной восходящей ветки (не говоря уже о возможности ссылаться на теги восходящего потока).

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


person jasonmp85    schedule 28.05.2014    source источник
comment
Обычный вариант использования, который я упоминаю, описан здесь , то есть отделить подкаталог и добавить его в основной проект с помощью git subtree add. Думаю последний абзац здесь обсуждает то, что я ищу.   -  person jasonmp85    schedule 29.05.2014


Ответы (1)


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

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

person Mike    schedule 04.06.2014
comment
См. комментарий, который я добавил к моему вопросу: Ваш вариант использования является типичным, т. Е. Вы разветвляете подкаталог ProjA в новый ProjB и хотите в будущем перенести изменения из ProjB обратно в ProjA. - person jasonmp85; 06.06.2014
comment
Я хочу разветвить подкаталог стороннего ProjA в свой собственный проект. ProjA продолжит разработку подкаталога в обычном режиме (они никогда не добавят меня в качестве поддерева), но я хочу иметь возможность получать от них исправления ошибок и т. д. в будущем. - person jasonmp85; 06.06.2014
comment
Да, это слияние поддеревьев. Вы можете внести свои собственные изменения в вилку локального поддерева (ProjA), а затем в ProjB вы должны получить и повторно разделить их обновления. Затем вы выполняете слияние поддеревьев, чтобы поместить новые изменения ProjB в ProjA. - person Mike; 07.06.2014
comment
Как уже говорилось, я не владею ProjA, у меня нет привилегий на фиксацию, и они не захотят снова слить мои изменения. Я беру один из их подкаталогов и превращаю в отдельный проект, но хочу аккуратно объединить их изменения в этот подкаталог. У меня нет разрешения добавлять мой проект в качестве поддерева в свой проект, и они не будут использовать поддеревья: они продолжат разработку в исходном подкаталоге, как и раньше. - person jasonmp85; 11.06.2014