git子模块是否有可能由其他几个git子模块组成,而超级git repo可以获取每个子模块的内容?
我尝试使用明显/天真的方法创建一个包含多个子模块的git repo。
然后将这个git repo添加到另一个git repo作为子模块。
然后尝试从git submodule init
然后git submodule update
拉出超级git仓库的根目录。但这无法获取子子模块。
答案 0 :(得分:174)
答案 1 :(得分:52)
如下Sridhar评论,来自Git1.6.5 +, git clone --recursive
现在是官方替代方案,描述于:
git clone --submodule
”--recursive
to a git repo” alias $ git config --global alias.cloner = 'clone --recursive'
,这可以避免影响正常的git clone
命令) inamiy正确points out commit b13fd5c git submodule update --init --recursive
中引入的git submodule update --init <submoduleName>
命令,再次在git1.6.5中,Johan Herland (jherland
)。
如果您只想结核子模块的一个子模块,那么
git submodule update --recursive
是要走的路。
(较旧的原始答案)
#!/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);
}
应该更新任何嵌套的子模块。但init部分可能不是递归的。
根据您的Git版本,您可以回到更“脚本化”的方法,本文Recursively Updating Git Submodules允许递归初始化和更新:
{{1}}