如何克隆git存储库,以便它也克隆其子模块?

运行gitclone$REPO_URL只会创建空的子模块目录。


当前回答

在填充子模块之前,您必须做两件事:

git submodule init 
git submodule update

其他回答

在填充子模块之前,您必须做两件事:

git submodule init 
git submodule update

Git 2.23(2019年第3季度):如果您想克隆子模块并将其更新到最新版本:

git clone --recurse-submodules --remote-submodules <repo-URL>

如果您只想在其录制的SHA1上克隆它们:

git clone --recurse-submodules <repo-URL>

见下文。

注意,Git 2.29(2020年第4季度)为子模块处理带来了显著的优化。

请参见Orgad Shaneh(orgads)提交的462bee(2020年9月6日)。(于2020年9月18日由Junio C Hamano(吉斯特)在提交中合并)

子模块:禁止检查对象id的文件名和ref歧义签字人:Orgad Shaneh

collect_changed_submodules()的argv参数仅包含对象id(所有引用的对象引用)。通过传递assume_dashdash通知setup_revisions()输入不是文件名,这样可以避免每个引用的冗余stat。还要抑制refname_ambiguity标志,以避免对每个对象进行文件系统查找。类似的逻辑可以在cat文件、pack对象等中找到。此更改将我的回购中的git fetch(man)时间从25秒缩短到6秒。


2010年原始答案

正如joschi在评论中提到的,git子模块现在支持--recursive选项(Git1.6.5及更多)。

如果指定了--recursive,则该命令将递归到已注册的子模块中,并更新其中的任何嵌套子模块。

有关init部分,请参阅递归使用git子模块。有关详细信息,请参阅git子模块。

在git 1.6.5版及更高版本中,您可以通过使用–recursive选项克隆超级项目来自动执行此操作:

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

2016年更新,使用git 2.8:请参阅“如何使用git clone加速/并行下载git子模块——递归?”

您可以使用多个线程并行启动获取子模块。例如:

git fetch --recurse-submodules -j2

更棒的是,使用Git 2.23(2019年第3季度),您可以在一个命令中克隆子模块并将其检出到其跟踪分支!

参见Ben Avison(bavison)的承诺4c69101(2019年5月19日)。(由Junio C Hamano(吉斯特)于2019年6月17日提交9476094合并)

clone:add--远程子模块标志

当使用gitclone--递归子模块时,以前无法将--remote开关传递给隐式git子模块更新命令您希望子模块在其上检出的任何用例远程跟踪分支,而不是超级项目中记录的SHA-1。此修补程序纠正了这种情况。它实际上通过了——也没有获取git子模块更新,因为子模块刚刚被克隆,所以再次从远程获取只会减慢速度。

这意味着:

--[no-]remote-submodules:

克隆的所有子模块将使用子模块远程跟踪分支的状态来更新子模块,而不是子项目记录的SHA-1。相当于将--remote传递给git子模块更新。

如果子模块是私有子模块,您可以使用凭证存储,这样它也可以递归地克隆其私有子模块。

USER=${GITHUB_ACTOR}
TOKEN=${{ secrets.JEKYLL_GITHUB_TOKEN }}

git config --global credential.helper store
echo "https://${USER}:${TOKEN}@github.com" > ~/.git-credentials

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

我用它来克隆我的子模块,其中私有模块位于第5层深处。请允许我向您展示它是如何运作的:

您可以从github复制克隆url

然后使用:git clone—递归

子模块并行获取旨在通过同时获取多个存储库来减少获取存储库及其所有相关子模块所需的时间。这可以通过使用新的--jobs选项来完成,例如:

git fetch --recurse-submodules --jobs=4

根据Git团队的说法,这可以大大加快包含许多子模块的存储库的更新速度。当在没有新的--jobs选项的情况下使用--recurse子模块时,Git将逐个获取子模块。

资料来源:http://www.infoq.com/news/2016/03/git28-released