Как сделать git clone --recursive и master checkout для всех подмодулей в одной строке?

Мне очень нравится эта команда для получения репо с подмодулями:

git clone [email protected]:my_user/my_repo.git --recursive

Однако, когда они приходят, подмодули настроены на "отсутствие ветки", и мне приходится вручную проверять мастер на каждом из них. Есть ли способ рекурсивно вытащить подмодули и автоматически настроить ветвь?

Ответ 1

После клонирования репозитория, содержащего ваши подмодули, следующая команда будет проверять главную ветвь на все это за один раз:

git submodule foreach --recursive git checkout master

Ответ 2

Как насчет:

git submodule update --init --recursive

Инициализировать все подмодули и подмодули внутри подмодулей. Не уверен, что это будет мастер проверки, хотя.

Ответ 3

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

Ответ 4

Возможно, вам стоит рассмотреть gitslave как альтернативу git -submodule, в зависимости от вашего рабочего процесса разработки это может быть лучше (или хуже). В частности, в вашей проблеме gitslave сохраняет всех членов суперпроекта в той же ветки (отсутствуют специальные команды git (not gitslave), чтобы сделать иначе, и даже тогда многие команды предупреждают вас, когда вы находитесь на разных ветвях).

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

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