子模块内部的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