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

git子模块是否可以由其他几个git子模块构成,而超级git回购可以为每个子模块获取内容?

我试图用明显/天真的方式创建一个拥有几个子模块的git仓库。

然后将此git回购作为子模块添加到另一个git回购。

然后尝试通过git submodule init从超级git仓库的根目录中取出,然后通过git submodule init git submodule update 。 但是这不能获取子子模块。


正如在Retrospectively中提到的那样 - 为git回购添加 - 递归

git submodule update --init --recursive

应该管用。


正如Sridhar在Git1.6.5 +下面的评论, git clone --recursive现在是官方的替代方案,描述如下:

  • git clone --submodule
  • “回顾性地添加 - --recursive到git回购”
    (使用alias $ git config --global alias.cloner = 'clone --recursive' ,避免使用正常的git clone命令)
  • inamiy正确地指出了git submodule update --init --recursive命令, git submodule update --init --recursive命令是在Johan Herland( jherland )的git1.6.5中的commit b13fd5c中引入的。

    IceFire在评论中补充道:

    如果您只想签出子模块的一个子模块,那么
    git submodule update --init <submoduleName>是要走的路。


    (旧的原始答案)

    根据手册页

     git submodule update --recursive
    

    应该更新任何嵌套的子模块。 但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);
    }
    
    链接地址: http://www.djcxy.com/p/92401.html

    上一篇: Git submodule inside of a submodule (nested submodules)

    下一篇: Remove local git tags that are no longer on the remote repository