Ответ 1
git clone --recursive
эквивалентен git submodule update --init --recursive
.
А обновление подмодуля git будет только извлекать записанный SHA1 (записанный в родительском репо):
Обновите зарегистрированные подмодули, то есть клонируйте отсутствующие подмодули и извлеките фиксацию, указанную в индексе репозитория.
Это приведет к отсоединению подмодулей HEAD.
2012: То есть, поиск активной ветки в подмодуле не является нормой. git submodule foreach 'git checkout master'
может по крайней мере установить основную ветвь (если вы уверены, что все записанные SHA1 должны были быть частью 'основной' ветки для каждого подмодуля.
2013-2014: вы можете настроить файл .gitmodules
, чтобы указать ветку для извлечения в вашем подмодуле.
Смотрите " Как мне обновить мои подмодули git из определенных веток? "
cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>
Любой пульт, который вы добавляете локально в подмодуль, например my-fork
, вообще не записывается в родительский репозиторий.
Поэтому, когда вы снова клонируете этот родительский репозиторий, он инициализирует и обновит подмодули, как записано в файле .gitmodules
(вы можете изменить этот адрес, но только один связан с каждым подмодулем).
Если у вас есть другой удаленный адрес для привязки к каждому подмодулю, вам нужен скрипт для автоматизации процесса.
Как объясняется в " Истинной природе подмодуля ", подмодуль в первую очередь предназначен для записи/доступа к фиксированной точке в истории.
Вы можете разрабатывать непосредственно в подмодуле, но вам нужно пойти туда и сделать правильную ветвь и/или добавить нужные пульты.
он выдает ошибку, утверждая, что не может найти сохраненные коммиты для этих репозиториев.
Каждый раз, когда вы делаете коммит в подмодуле, вам необходимо:
- перенесите его на связанный пульт (т.е. тот, который записан в
.gitmodules
родительского репо) - вернитесь в родительский репо и зафиксируйте указанного родителя.
Но:
Если вы нажали на " my-fork
", в то время как соответствующее удаленное репо этого подмодуля не было " my-fork
"... тогда следующий клон не сможет извлечь эту подмодульную фиксацию.
Обновление Август 2014 (Git 2.1)
Смотрите коммит 9393ae7 Мэтью Чена (charlesmchen
):
подмодуль: документ " sync --recursive
"
Команда "
git submodule sync
" поддерживает флаг--recursive
, но в документации это не упоминается.
Этот флаг полезен, например, когда пульт ДУ изменяется в подмодуле подмодуля.
Обновление Git 2.23 (3 квартал 2019)
Вы также можете рассмотреть git clone --recurse-submodule --remote-submodules
: он будет клонировать с подмодулями, уже извлеченными в их ветки отслеживания, вместо родительского репозитория gitlink SHA1.