Подмодуль Git для отслеживания удаленной ветки

Я пытаюсь использовать подмодули git для агрегирования 10+ репозиториев в одну структуру для легкой разработки.

Предполагается клонировать модуль и проверять ветку. Вместо этого модуль проверяется в режиме отсоединенной головки.

git clone [email protected]:org/global-repository.git
git submodule update —init
cd config-framework
git status

$git status
#HEAD detached at b932ab5
nothing to commit, working directory clean

Файлы gitmodules выглядят нормально

$cat .gitmodules 
[submodule "config-framework"]
        path = config-framework
        url = [email protected]:org/config-framework.git
        branch = MY_BRANCH

Мы хотим, чтобы ветвь MY_BRANCH была проверена по умолчанию, а не отсоединена. Как мы это достигаем?

Ответ 1

Субмодули всегда проверяются в режиме отключенного HEAD.

Это потому, что подмодуль проверяет SHA1, хранящийся в специальной записи в индексе родительского репо.

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

git submodule update --init --remote

--remote сделает git fetch, а также проверку нового HEAD.
Увы, даже эта проверка будет иметь фиксацию, а не ветку (поскольку у вас нет локальной ветки по умолчанию в подмодуле), поэтому... вернуться в автономный режим HEAD.
См. Больше в разделе Git подмодулей: укажите ветку/тег".

Вы можете попробовать (не тестировать) a:

git submodule foreach 'git checkout -b $(git config -f /path/to/parent/repo/.gitmodules --get submodule.$path.branch)'

Я использую тот факт, что git submodule foreach имеет доступ к '$path', названию каталога подмодуля относительно суперпроекта.


Произошла попытка указать ветвь для автоматического выделения субмодуля в (commit 23d25e4 для Git 2.0).... но он был отменен (commit d851ffb, 2 апреля 2014 года)!
Это может произойти в ближайшее время, но не в его текущей реализации.

Ответ 2

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