Можете ли вы развиваться непосредственно в подмодулях Git?

У меня есть два проекта (A и B). Оба используют проект Common. Я хочу включить Common в и B через подмодули, потому что тогда я могу напрямую связать каждую фиксацию в и B, на которую они полагаются, в Common.

В прошлом я пытался заставить свою команду использовать подмодули, как это, но мы не могли заставить ее работать гладко. Мы разрабатывали Common code из самого субмодуля и компилировали из подмодуля, но мы столкнулись с таким количеством проблем, что мы вернулись к тому, что все проекты находятся в одном каталоге (C:\dev\A, C:\dev\Common).

Я уверен, что мы понятия не имеем, как должны использоваться подмодули, но если вы не можете разработать Common code непосредственно в подмодуле, разве это не усложняет разработку? Может ли кто-нибудь объяснить правильное использование подмодулей?

Ответ 1

Вы можете развиваться непосредственно из подмодуля (как я объяснил в истинной природе подмодулей).
Но каждый раз, когда вы совершаете что-то в подмодуле (и публикуете его где-то), вам необходимо также зафиксировать его в родительском репозитории.

Теперь у вас есть две организации подмодулей:

  • рекурсивный включает
A
  Common
    (Common could depend itself on other dependencies)
B
  Common
    ...
  • или direct включает (только прямые зависимости)
ParentA
   A
   Common
   Other A dependencies
ParentB
   B
   Common
   Other B dependencies

(На самом деле, если Common имеет собственные зависимости, A или B будет зависеть от "ParentCommon", который будет ссылаться на Common и все его прямые зависимости)

Если у вас есть структурный императив, где Common должен быть подкаталогом A, я бы рекомендовал вторую организацию, которая ближе к вашему C:\dev\A, C:\dev\Common.

На самом деле, я предпочитаю только одну глубинную зависимость, где для ParentA я перечисляю все зависимости, прямые и косвенные, как подмодули.

Это связано с тем, что с любым инструментом, пытающимся управлять зависимостями, вам все равно придется принимать решения:

  • конфликты зависимостей (A зависит от X, которому требуется Z1 и Y, которому требуется Z2: какую версию Z вы хотите использовать/компилировать в своем проекте?)
  • переопределение зависимостей (когда A зависит от X, которому требуется Z1, тогда как A также выбирает использовать X2)
  • цикл зависимостей (где A зависит от B, который полагается на C, который использует... A!)

Ответ 2

Субмодули - это не то, что работает особенно гладко, как вы его здесь намереваетесь. Как вы, вероятно, заметили, чтобы внести изменения в проект в подмодуле (как из Git v1.7, вероятно, на бесконечность), вам необходимо:

  • Сделайте изменение в подмодуле.
  • Примите участие в подмодуле, получив новый хэш SHA.
  • Обновить внешний файл проекта .gitmodules с новым хешем.
  • Примите во внимание внешний проект.

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

Попытка стека стека, тем не менее, развитие блокировки с подмодулями , вероятно, указывает на одну из нескольких больших проблем:

  • У вас нет четкого интерфейса между вашим подкомпонентом и деталями реализации через границы.
  • У вас нет хорошо продуманного интерфейса к вашему подкомпоненту, поэтому вам придется переосмыслить все, когда вы решаете более интересную проблему.
  • Ваш интерфейс стабилен и качественный, но у вас нет хорошего процесса QA для кода подмодуля, поэтому вместо этого вы постоянно исправляете это, пытаясь выполнить другую работу.
  • (Esp., если A и B меняют разные вещи). Ваш "общий" код на самом деле намного меньше, чем вы думаете, или его нужно разделить по-разному.

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

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