Как мне сделать git clone --recursive и checkout master для всех подмодулей в одной строке? - PullRequest
48 голосов
/ 25 июня 2011

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

git clone git@github.com:my_user/my_repo.git --recursive

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

Ответы [ 5 ]

65 голосов
/ 25 сентября 2012

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

git submodule foreach --recursive git checkout master
55 голосов
/ 25 июня 2011

Как насчет:

git submodule update --init --recursive

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

24 голосов
/ 29 декабря 2011

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

6 голосов
/ 25 июня 2011

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

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

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

2 голосов
/ 11 марта 2019

Как уже отвечено

git submodule foreach --recursive git checkout master

выполняет работу для ветви master .

Но если это ветвь, которой нет во всех подмодуляхможно использовать

git submodule foreach --recursive "git checkout branchname || true"

В противном случае команда потерпит неудачу на первом репо, не имеющем указанной ветви.

...