子模块内部的Git子模块(嵌套子模块)

fir*_*der 129 git git-submodules

git子模块是否有可能由其他几个git子模块组成,而超级git repo可以获取每个子模块的内容?

我尝试使用显而易见的/天真的方法来创建一个包含多个子模块的git repo.

然后将此git repo添加到另一个git repo作为子模块.

然后尝试从超级git仓库的根目录拉出git submodule init然后git submodule update.但这无法获取子子模块.

ina*_*miy 191

正如Retrospectively中提到的那样 - 在git repo中添加--recursive

git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

应该管用.

  • 这对我有用.注意我错误地认为`git submodule init; git submodule update --recursive`与上面的内容同义,但事实并非如此. (12认同)

Von*_*onC 53

正如Sridhar在下面评论的那样,从Git1.6.5 +开始,git clone --recursive现在是官方替代品,描述如下:

inamiy正确地指出git submodule update --init --recursive命令,在引入提交b13fd5c,再次在git1.6.5,由约翰她乡(jherland).

并且IceFire 在评论中添加:

如果您只想检查子模块的一个子模块,那么
git submodule update --init <submoduleName>就是要走的路.


(较旧的原始答案)

根据手册页

 git submodule update --recursive
Run Code Online (Sandbox Code Playgroud)

应该更新任何嵌套的子模块.但init部分可能不是递归的.

根据您的Git版本,您可以回退到更"脚本化"的方法,本文递归更新Git子模块,允许递归初始化和更新:

#!/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);
}
Run Code Online (Sandbox Code Playgroud)