Ответ 1
Как упоминалось в Retrospectively add --recursive для git repo
git submodule update --init --recursive
должен работать.
Возможно ли, чтобы подмодуль git был сделан из нескольких других подмодулей git, а супер git репо, чтобы получить содержимое для каждого подмодуля?
Я попытался сделать это, используя очевидный/наивный подход к созданию репозитория git, содержащего несколько подмодулей.
Затем добавив этот git репо к другому репо git как подмодуль.
Затем попытаемся извлечь из корневого каталога супер git репо git submodule init
, а затем git submodule update
. Но это не позволяет получить под-подмодули.
Как упоминалось в Retrospectively add --recursive для git repo
git submodule update --init --recursive
должен работать.
Как Sridhar ниже, из Git1.6.5 +, git clone --recursive
теперь является официальной альтернативой, описанной в:
git clone --submodule
" --recursive
в git repo" alias $ git config --global alias.cloner = 'clone --recursive'
, что позволяет избежать затенения нормальной команды git clone
) inamiy правильно указывает команду git submodule update --init --recursive
, введенную в зафиксировать b13fd5c, снова в git1.6.5, Johan Herland (jherland
).
И IceFire добавляет в комментариях:
Если вы хотите проверить только один подмодуль подмодуля, тогда
git submodule update --init <submoduleName>
- путь.
(более старый исходный ответ)
В соответствии с справочной страницей
git submodule update --recursive
должен обновлять любые вложенные подмодули. Но часть init может не быть рекурсивной.
В зависимости от вашей версии Git вы можете вернуться к более "сценарийному" подходу, с помощью этой статьи Рекурсивно обновить git Submodules, который позволяет рекурсивно инициализировать и обновлять:
#!/usr/bin/perl
use strict;
use Cwd;
init_and_update();
exit;
sub init_and_update
{
my $start_path = cwd();
my %paths;
my $updated;
do
{
my $data = `find . -name '.gitmodules'`;
chomp($data);
$data =~ s/\/\.gitmodules//g;
foreach my $path (split(/\n/, $data))
{
$paths{$path} = '' if($paths{$path} eq '');
}
$updated = 0;
foreach my $path (sort keys %paths)
{
if($paths{$path} eq '')
{
chdir($path);
`git submodule init 2>&1`;
`git submodule update 2>&1`;
chdir($start_path);
if($ARGV[0] eq '--remove-gitmodules')
{
unlink("$path/.gitmodules");
}
$paths{$path} = 1;
$updated++;
}
}
} while($updated);
}