181

Is it possible for a git submodule to be made of several other git submodules, and the super git repo to fetch the contents for each submodule?

I have tried to do this using the obvious/naive approach of creating a git repo holding several submodules.

Then adding this git repo to another git repo as a submodule.

Then attempting to pull from the root directory of the super git repo by git submodule init and then git submodule update. But this fails to fetch the sub-submodules.

1
  • I suggest that you use TortoiseGit -- use it in your root and then ask it to update all submodules with Initialize, Recursive, Force checked ! Commented Nov 20, 2018 at 13:53

2 Answers 2

275

As mentioned in Retrospectively add --recursive to a git repo

git submodule update --init --recursive

should work.

Sign up to request clarification or add additional context in comments.

6 Comments

This worked for me. Note that I erroneously thought that git submodule init; git submodule update --recursive was synonymous with the above, but it is not.
+1 I like this much better than what I was using: git submodule foreach git submodule init ... then git submodule update --recursive
Unfortunately this didn't work for me. No erros, no messages, nothing.
How do you update theses fully nested repos though? When I pass in the --init flag, the submodules, within one of my submodules, just get initialized to old versions, not the most current ones.
I do git submodule foreach git pull origin master, and it works partially: submodules are updated, but sometimes the HEAD gets detached and for submodules within submodules, I can't commit my direct submodule's changes because it has "modified content" not "new commits" (since its own submodules have "new commits" and are updated).
|
60

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);
}

4 Comments

Is not git clone --recursive sufficient?
@Sridhar: it is, for cloning, as mentioned in stackoverflow.com/questions/3796927/git-clone-submodule and stackoverflow.com/questions/4251940/…, from Git1.6.5 and later. I have edited my answer to reflect that.
Note: If you would like to checkout only one submodule of a submodule, then git submodule update --init <submoduleName> is the way to go; I got here when searching for this answer
@IceFire Thank you. I have included your comment in the answer for more visibility.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.