Каковы варианты при работе с подмодулями Git, из которых сделаны коммиты?

На работе мы работаем над десятком пакетов Java OSGi, каждый из которых имеет свой собственный репозиторий git. Все связки будут, в конечном счете, довольно независимыми друг от друга, что оправдывает отдельные репозитории - хотя сейчас мы все еще часто модифицируем несколько из них одновременно.

Когда мы создаем выпуск продукта (который состоит из всех пакетов), в каждом пакете создается новая ветвь, что немного больно. Поэтому мы думали об использовании git -подмодуля для облегчения боли (что-то вроде git submodule foreach <cmd>).

Итак, наша желаемая настройка - это мастер-проект Product и подмодули для каждого пакета:

Project/
  BundleA/
  BundleB/
  BundleC/

Теперь я потратил несколько часов на чтение всего, что мог найти о подмодулях, и я понял, что если я изменяю вещи в BundleA, я должен зафиксировать в BundleA, нажать, а затем зафиксировать изменение подмодуля в Project и снова нажмите.

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

  • bare-bones git -submodule use
  • с использованием существующей оболочки git:
  • напишите мои собственные простые скрипты bash для пакетной обработки пакетов OSGi

Любые другие предложения приветствуются.

Ответ 1

Вам не нужно отслеживать, что делает подпроект в суперпроекте (жесткая привязка), поэтому я рекомендую вам оставаться вдали от git -submodules.

gitslave (http://gitslave.sf.net) по существу является большим foreach вокруг каждого из подпроектов с конфигурационным файлом в суперпроекте, перечисляющем подпроекты. Есть много колоколов и свистков, которые делают его более удобным, но если ваша цель состоит в том, чтобы выполнить ту же команду над суперпроектом (необязательно) и всеми подпроектами, gitslave примерно так же удобен, как вы собираетесь найти.

Так, например, для создания новой ветки в gitslave:

gits checkout -b newbr

Затем ваш суперпроект и все подпроекты создадут новую ветку и изменят ее. В общем случае, если вы хотите запустить команду gits для всех членов суперпроекта, просто измените команду "git" на "gits".

Ответ 2

Теперь я потратил несколько часов на чтение всего, что мог найти о подмодулях, и я понял, что если я изменяю вещи в BundleA, мне нужно совершить в BundleA, нажать, а затем зафиксировать изменение подмодуля в Project и снова нажать.

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

Я думаю, что именно так, как предполагается, будут использоваться подмодули, я боюсь. Хотя, возможно, предположение, как правило, вы принимаете только новую версию в основном проекте относительно редко, так как вы утверждаете, что эта версия подмодуля работает правильно с этой версией основного проекта. Нынешний дизайн системы подмодулей довольно ограничен в том, что он может сделать, поскольку единственные вещи, которые главный проект знает о подмодуле:

  • Что должно быть связано с подмодулем, хранящимся в дереве вместо хэша блоба или дерева
  • URL-адрес по умолчанию для репозитория, который должен содержать эту фиксацию, хранящуюся в .gitmodules и установленную в конфигурации при инициализации подмодуля

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

Из способов упрощения этого процесса, который вы упомянули, стоит уточнить, что репо фактически не использует подмодули - это альтернативная система. Это аналогично случаю git -slave, который, по-видимому, рекомендуют многие пользователи.

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

Еще одна (не субмодулярная) альтернатива, которую вы можете посмотреть, - git-subtree, не следует путать с стратегией слияния поддерева.