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

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

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

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

然后尝试通过 git submodule initgit submodule update从超级 git 回购的根目录中提取。但是这无法获取子模块。

63434 次浏览

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

正确的 指出 git submodule update --init --recursive命令,在 提交 b13fd5c中引入,同样在 git1.6.5中,由 Johan Herland (jherland)引入。

冰火增加了 在评论中:

如果您只想签出子模块的一个子模块,那么
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);
}

正如 回顾性地添加——递归到 git repo中提到的

git submodule update --init --recursive

应该可以。