正如Sridhar在下面的评论中(来自Git1.6.5 +),git clone --recursive
现在是官方替代方法,其描述如下:
inamiy正确指出了由Johan Herland()git submodule update --init --recursive
在commit b13fd5c和git1.6.5中引入的命令。jherland
而IceFire增加的评论:
如果您只想检出一个子模块中的一个子模块,那么
git submodule update --init <submoduleName>
该方法是可行的。
(旧的原始答案)
根据手册页
git submodule update --recursive
应该更新任何嵌套的子模块。但是init部分可能不是递归的。
根据您的Git版本,您可以使用一种更“脚本化”的方法,本文通过递归更新Git子模块来实现递归初始化和更新:
#!/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);
}