Git submodule inside of a submodule (nested submodules)

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.


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);
    }
    
    链接地址: http://www.djcxy.com/p/92402.html

    上一篇: 递归到一个git回购

    下一篇: 子模块内部的Git子模块(嵌套子模块)