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

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


当前回答

您可以从github复制克隆url

然后使用:git clone—递归

其他回答

试试这个。

git clone -b <branch_name> --recursive <remote> <directory>

如果在分支中添加了子模块,请确保将其添加到clone命令中。

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

git submodule init 
git submodule update

克隆存储库时,可以使用--recursive标志。此参数强制git克隆存储库中所有已定义的子模块。

git clone --recursive git@repo.org:your_repo.git

克隆后,有时子模块分支可能会发生更改,因此在其之后运行以下命令:

git submodule foreach "git checkout master"

只需在项目目录中执行这些操作。

$ 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子模块更新。