一个 git 子模块是否可以由其他几个 git 子模块组成,超级 git repo 是否可以获取每个子模块的内容?
我尝试使用显而易见/幼稚的方法来创建一个包含多个子模块的 git repo。
然后将这个 git repo 作为子模块添加到另一个 git repo。
然后尝试通过 git submodule init和 git submodule update从超级 git 回购的根目录中提取。但是这无法获取子模块。
git submodule init
git submodule update
正如 Sridhar下面的评论,从 Git1.6.5 + ,git clone --recursive现在是官方的替代品,描述如下:
git clone --recursive
git clone --submodule
--recursive
alias $ git config --global alias.cloner = 'clone --recursive'
git clone
正确的 指出 git submodule update --init --recursive命令,在 提交 b13fd5c中引入,同样在 git1.6.5中,由 Johan Herland (jherland)引入。
git submodule update --init --recursive
jherland
冰火增加了 在评论中:
如果您只想签出子模块的一个子模块,那么 git submodule update --init <submoduleName>是正确的选择。
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中提到的
应该可以。