Стратегия управления подмодулем Git

Мы используем GIT для управления нашим проектом.

У каждого проекта есть «ядро» (например, структура, из которой мы будем строить проект). Таким образом, у каждого проекта есть как минимум 2 удаленные ветки:

  • 1 репозиторий для этой основной структуры.
  • 1 репозиторий на клиентский проект.

У нас тоже есть модули. У каждого модуля есть ядро, содержащее базовую функциональность, и мы персонализируем каждый модуль из этой базы для каждого клиента.

  • Итак, у нас есть подмодули, которые включены в каждый клиентский проект.
  • Но я не могу понять, как обращаться с частью персонализации подмодулей.

Как GIT может мне помочь, если я хочу добавить несколько новых файлов в подмодуль, который должен использоваться только в одном конкретном клиентском проекте?

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

P.S. Мы используем SmartGit.


person FMaz008    schedule 27.04.2011    source источник


Ответы (2)


Это сценарий, в котором вы можете использовать git-subtree (слияние)

Если вы внесли изменения в другой проект в своем репозитории, они могут захотеть объединиться с вашим проектом. Это возможно с помощью поддерева  — оно может сдвигать вверх пути в вашем дереве, а затем они могут объединять только соответствующие части вашего дерева.

http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html

Идея слияния поддеревьев заключается в том, что у вас есть два проекта, и один из них отображается в подкаталог другого, и наоборот. Когда вы указываете слияние поддеревьев, Git достаточно умен, чтобы понять, что одно является поддеревом другого, и выполнить слияние соответствующим образом — это довольно удивительно.

http://progit.org/book/ch6-7.html

Но я полагаю, вы хотите использовать подмодули и не отходить от них.

person manojlds    schedule 27.04.2011
comment
Меня интересует только подмодуль, потому что если мы исправим что-то в ядре модуля, очень легко применить изменения в каждом проекте. - person FMaz008; 27.04.2011

Я не могу, так как каждый подмодуль независим.

Хотя это правда, что подмодуль является «независимым», поскольку он имеет свой собственный набор коммитов и ветвей в качестве отдельного репозитория, вы все равно можете определить ветку клиентского проекта в указанном подмодуле.

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

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

person VonC    schedule 27.04.2011
comment
Но ветки должны быть удаленными, чтобы ими могли пользоваться все разработчики. Значит ли это, что мне придется создавать 1 репозиторий для каждой версии субмодуля для каждого клиента? Итак, если я использую 10 подмодулей, мне придется создать 11 репозиториев для обработки 1 проекта? - person FMaz008; 27.04.2011
comment
@FMaz008: 1 репозиторий на подмодуль: подмодуль является уже репозиторием. Если вы используете 10 подмодулей в клиенте проекта, вы ссылаетесь на них в файле .submodules. Каждая ветка, созданная либо в родительском репозитории, либо в одном из подмодулей, будет совместно использоваться после отправки в соответствующий репозиторий вышестоящего уровня. - person VonC; 27.04.2011
comment
Да, эту часть я понимаю. Итак, это подтверждает, что мне придется создать столько репозиториев, сколько у меня будет подмодулей для каждого проекта. - person FMaz008; 27.04.2011
comment
@ FMaz008: я не уверен, что вы подразумеваете под созданием репозитория: они уже должны существовать. Что вы будете делать, так это получить локальный рабочий каталог, заполненный родительским репо, и рекурсивно всеми репозиториями подмодулей, на которые ссылается родительский репо. Каждый клиентский проект будет напрямую использовать только один репозиторий (репозиторий клиентского проекта) с каждой из этих ссылок на все основные подмодули, которые вам нужны. - person VonC; 27.04.2011
comment
То, что вы описали, похоже на мою реальную установку. Но проблема в том, что когда я изменяю что-то конкретное для проекта клиента 1 в подмодуле, на который есть ссылка в этом проекте, он помещается в репозиторий подмодулей. Поэтому, когда я захожу в проект client2 и вытаскиваю, я получаю конкретную модификацию :(. Проблема: я не могу отличить ядро ​​от специфики. - person FMaz008; 28.04.2011