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