Now you can make use of nested submodules in your project and have changes down the line pulled all the way up to your main project.
This is because of some major drawbacks around git submodules, such as being locked to a specific version of the outer repo, the lacking of effective merge management, and the general notion that the Git repository itself doesn't really know it's now a multi-module repository.
git clone(1) --recursive. Clone a repository into a new directory. --recursive, --recurse-submodules After the clone is created, initialize all submodules within, using their default settings. This is equivalent to running git submodule update --init --recursive immediately after the clone is finished.
Git allows you to include other Git repositories called submodules into a repository. This allows you to track changes in several repositories via a central one. Submodules are Git repositories nested inside a parent Git repository at a specific path in the parent repository's working directory.
As mentioned in Retrospectively add --recursive to a git repo
git submodule update --init --recursive
should work.
As Sridhar comments below, from Git1.6.5+, git clone --recursive
is now the official alternative, described in:
git clone --submodule
"--recursive
to a git repo"alias $ git config --global alias.cloner = 'clone --recursive'
, which avoids shadowing the normal git clone
command)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);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With