一个 git 子模块能否由多个其他的 git 子模块组成?如果可以,那么超级 git 仓库是否可以获取每个子模块的内容呢?
我曾尝试通过创建一个包含多个子模块的 git 仓库,并将该 git 仓库作为子模块添加到另一个 git 仓库中来实现这一点。
然后,我尝试从超级 git 仓库的根目录中运行 git submodule init
和 git submodule update
命令进行拉取,但是这未能获取子子模块的内容。
一个 git 子模块能否由多个其他的 git 子模块组成?如果可以,那么超级 git 仓库是否可以获取每个子模块的内容呢?
我曾尝试通过创建一个包含多个子模块的 git 仓库,并将该 git 仓库作为子模块添加到另一个 git 仓库中来实现这一点。
然后,我尝试从超级 git 仓库的根目录中运行 git submodule init
和 git submodule update
命令进行拉取,但是这未能获取子子模块的内容。
正如在Retrospectively add --recursive to a git repo中提到的那样。
git submodule update --init --recursive
应该可以工作。
git submodule init; git submodule update --recursive
与上述命令同义,但实际上并不是。 - jsdalton--init
标志时,子模块中的一个子模块中的版本只是被初始化为旧版本,而不是最新版本。 - cintrongit submodule foreach git pull origin master
命令,它部分地起作用:子模块得到更新,但有时候 HEAD
会被分离,对于嵌套的子模块,我无法提交直接子模块的更改,因为它具有“修改内容”而不是“新提交”(因为其自身的子模块具有“新提交”并已更新)。 - cintron--remote
:
git submodule update --init --recursive --remote
- felipekm正如Sridhar在下面评论中所说,从Git1.6.5+开始,git clone --recursive
现在是官方的替代方法,描述如下:
git clone --submodule
"--recursive
"alias $ git config --global alias.cloner = 'clone --recursive'
,避免遮盖正常的git clone
命令)inamiy 正确地指出了git submodule update --init --recursive
命令,该命令在提交 b13fd5c中首次引入,再次在git1.6.5中由Johan Herland (jherland
)引入。
如果您只想检出子模块的一个子模块,则使用
git submodule update --init <submoduleName>
即可。
git submodule update --recursive
应该更新任何嵌套的子模块。但是初始化部分可能不是递归的。
根据您的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 clone --recursive
不够吗? - Sridhar Ratnakumargit submodule update --init <submoduleName>
是正确的方法;我在搜索这个答案时找到了它。 - IceFire