Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Git submodule inside of a submodule (nested submodules)

People also ask

Can submodules have submodules?

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.

Why you should not use git submodules?

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.

What does recursively clone submodules mean?

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.

Can I have nested git repositories?

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"
  • "Retrospectively add --recursive to a git repo"
    (with the 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);
}