Как адаптировать мою стратегию svn: externals к подмодулям git?

Мне трудно понять, как изменить свое мышление на git, и у вас возникла следующая проблема. У меня есть ситуация, когда у нас есть общий движок и несколько проектов, которые используют движок. Внутренние команды разработчиков и команды сторонних разработчиков могут работать над проектами, использующими общий движок, и хотят использовать HEAD для общего движка как можно больше во время разработки, пока за несколько недель до корабля, где общий движок будет помечен и разветвленный, и тогда проект будет использовать эту ветвь. Команды проекта обычно работают только по одному проекту, но могут вносить изменения в общий движок во время отладки или добавления функций. Когда они фиксируют эти изменения, наша система сборки работает, чтобы найти какие-либо проблемы, которые они могли бы внести с фиксацией.

Я (думаю, я) хочу использовать эту же модель с новым проектом/новой компанией. В svn структура была примерно такой: shared_engine

project_in_dev-+
               +- svn:external shared_engine:head
project_about_to_ship-+
                      +-svn:external shared_engine_rev1_branch

Это сработало очень хорошо:

  • Разработчики проекта могут выполнить одну команду, чтобы проверить все зависимости, которые им нужны.
  • Разработчики проектов могли бы работать с двигателем и совершать совлокальный движок легко.
  • Мы могли бы легко обновить или изменить общий движок, который использовался проектом с внешними версиями и версиями.
  • Обновления движка были легко доступны для ежедневного обновления из корневого проекта.

ОК, теперь я перешел на git, а подмодули SEEM - новый способ борьбы с внешним кодом, но кажется, что я теряю некоторые функции.

  • Это многоэтапный процесс, чтобы фактически получить все зависимости проекта. Разработчики проекта должны сделать клон git, а затем обновить подмодуль подмодуля git init/git --recursive
  • Это многоэтапный процесс для обновления корневого проекта и подмодуля, поэтому, если изменения внесены в корневой проект другим разработчиком, который соответствует изменениям в подмодуле, вы не получите соответствующий код немедленно и можете очень запутаться
  • Подмодуль заблокирован для конкретной фиксации, и если вы вносите изменения в подмодуль, у вас возникнут проблемы с его работой с главой общего движка
  • Я не могу контролировать, какую ревизию общего движка разработчик проекта проверил, не указав, что обновить до

Итак, мои вопросы таковы:

  • В первую очередь, правильны ли предположения о правильности подмодулей? Кажется, он основан на том, что я читал, но я не уверен на 100%, поскольку я все еще выясняю git
  • Если мои предположения верны, я подхожу к проблеме с правильным процессом? Нужно ли мне перенастраивать свое мышление при использовании git? Другими словами, есть ли другой способ делать то, что я пытаюсь сделать, и думать о процессе по-другому?
  • Предполагая, что я не взорвал первые два, и подмодули не будут делать то, что я хочу, что будет? Я читал о слиянии поддерева, но они не выглядят точно так же, как кажется, что я не могу получить изменения, внесенные в общий код обратно в репозиторий.

Большое спасибо за вашу помощь и терпение. Если это не очевидно, я очень новичок в git, и мне это нравится, и я хочу охватить его, но у меня все еще есть некоторые концептуальные недоразумения, потому что я, вероятно, был поврежден мозгом за годы использования центральных репозиториев. Я хочу учиться! Кроме того, я весь день работал на rtfm'ing и смотрел на различные сообщения в блогах, вопросы с stackoverflow и т.д., И я до сих пор не понимаю, я, очевидно, нуждаюсь в этом, чтобы шаг за шагом изложить свою ситуацию. У меня нет коллег, чтобы спросить об этом, какие-либо группы пользователей в районе Сиэтла, где могут быть некоторые гуру git?:)

Ответ 1

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

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

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

ИЗМЕНИТЬ

Я нашел подробное объяснение о подмодулях: http://longair.net/blog/2010/06/02/git-submodules-explained/.