As Sridhar comments below, from Git1.6.5+, git clone --recursive is now the official alternative, described in:
inamiy correctly points out the git submodule update --init --recursive command, introduced in commit b13fd5c, again in git1.6.5, by Johan Herland (jherland).
And IceFire adds in the comments:
If you would like to checkout only one submodule of a submodule, then
git submodule update --init <submoduleName> is the way to go.
(older original answer)
According to the manual page
git submodule update --recursive
should update any nested submodules. But the init part may not be recursive.
Depending on your version of Git, you could fall back to a more "scripting" approach, with this article Recursively Updating Git Submodules which allows for recursive init and update:
#!/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); }