子模块内部的Git子模块(嵌套子模块)
git子模块可能是由其他几个git子模块构成的,超级git回购可以为每个子模块获取内容?
我试图用明显的/天真的方法来创build一个拥有几个子模块的git仓库。
然后添加这个git回购作为一个子模块的另一个git回购。
然后试图通过git submodule init
从超级git仓库的根目录下拉git submodule update
。 但是这不能获取子子模块。
正如在回顾中提到的那样- 为git回购添加 – recursion
git submodule update --init --recursive
应该pipe用。
正如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
命令,在约翰·赫兰( jherland
)的 git1.6.5中,在commit b13fd5c中再次介绍。
IceFire 在评论中补充道:
如果您只想签出子模块的一个子模块,那么
git submodule update --init <submoduleName>
是要走的路。
(旧的原始答案)
根据手册页
git submodule update --recursive
应该更新任何嵌套的子模块。 但init部分可能不是recursion的。
根据您的Git版本,您可以使用本文recursion更新Git子模块 ,以便recursion初始化和更新,从而回到更“脚本化”的方式:
#!/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); }