以下のSridharのコメントのように、Git1.6.5+ からgit clone --recursive
は、以下で説明されている公式の代替手段になりました。
inamiyは、コミット b13fd5cで導入され、再び git1.6.5 でJohan Herland ( )によって導入されたコマンドを正しく指摘しています。git submodule update --init --recursive
jherland
そして、IceFireはコメントに次のように追加します。
サブモジュールのサブモジュールを 1 つだけチェックアウトしたい場合は、これが最適
git submodule update --init <submoduleName>
です。
(古い元の回答)
マニュアルページによると
git submodule update --recursive
ネストされたサブモジュールを更新する必要があります。ただし、init 部分は再帰的ではない場合があります。
Git のバージョンによっては、再帰的な初期化と更新を可能にするこの記事Recurively Updating 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);
}