题 如何`git clone`包括子模块?


我正在尝试将子模块放入回购。

问题是当我克隆父repo时,子模块文件夹是完全空的。

是否有任何方法可以使'git clone parent'实际将数据放入子模块文件夹中?

例: http://github.com/cwolves/sequelize/tree/master/lib/

nodejs-mysql-native 指着一个外部的git,但当我结帐时 sequelize 项目,该文件夹是空的...


1466
2017-09-26 07:13


起源




答案:


使用Git 2.13及更高版本, --recursive 已被弃用 --recurse-submodules 应该用来代替:

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

编者注: -j8 是一个可选的性能优化,在2.8版本中可用,并且一次最多可以获取8个子模块 - 请参阅 man git-clone

使用版本1.9的Git直到版本2.12(-j 标志仅适用于2.8+版本):

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

使用Git及更高版本的1.6.5版,您可以使用:

git clone --recursive git://github.com/foo/bar.git
cd bar

对于已经克隆的repos或较旧的Git版本,请使用:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive

2313
2017-12-14 10:43



有没有办法在git存储库中将此行为指定为默认值,以便不太知情的克隆者自动获取初始化的子模块? - NHDaly
@NHDaly可悲的是,没有。 (至少我不知道。) - Mathias Bynens
而逻辑思维的git clone --recursive也会填充子模块的任何子模块,对吧? - jayarjo
为'较旧'的git方式+1,允许你在已经克隆的repos上执行此操作 - Mike
@toszter:这么明智吗?如果持有回购需要一个子模块的版本怎么办? 不  master? - Gauthier


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

git submodule init 
git submodule update

354
2017-09-26 07:19



我很害怕......因为你在这种情况下检查了一个部分项目,所以没有任何意义。我知道子模块更新不是自动的,但为什么绑定版本不会自动检出?有没有办法强迫它?我有一个包含3级子模块的项目,为了进行结账,我必须遍历那么远才是荒谬的。 - Mark
请阅读 git-submodule(1) 手册页(kernel.org/pub/software/scm/git/docs/git-submodule.html)。你会发现的 git submodule update 支持一个很好的参数调用 --recursive。 - joschi
为什么不在一个命令中同时执行它们? git submodule update --init (另见 我的答案)。 - Mathias Bynens
我认为用这两个命令回答这个问题会更好。它更好地解释了如何完成任务。 - schmijos
@MathiasBynens我刚登录的机器只有git 1.5.5.6,它显然不支持缩短的指令,但确实支持它作为两个命令。 - Jack Poulson


原始答案2010

joschi 在评论中提到, git submodule 现在支持了 --recursive 选项(Git1.6.5及更多)。

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

看到 递归地使用git子模块 对于init部分。
看到 git submodule 解释 更多。

使用1.6.5版本的git及更高版本,你可以通过克隆超级项目来自动完成 –-recursive 选项:

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

2016年更新,使用git 2.8:参见“如何加速/并行化git子模块的下载使用 git clone --recursive

您可以并行使用多个线程启动子模块。
为实例:

git fetch --recurse-submodules -j2

141
2017-09-26 08:17



应该是选择的答案,实际上以简单的庄园回答问题而不是以不同方式(更复杂地)做出建议。这些信息也很有价值,但不回答问题。 - Denny
这应该是我认为的答案。简单,简洁,有效。 - Danny


您可以使用此命令克隆包含所有子模块的repo:

git clone --recursive YOUR-GIT-REPO-URL

或者,如果您已经克隆了项目,则可以使用:

git submodule init
git submodule update

31
2017-10-16 15:47





如果您的子模块已添加到分支中,请务必将其包含在克隆命令中...

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

28
2018-03-07 22:28





尝试这个:

git clone --recurse-submodules

假设您已将子模块添加到父项目,它会自动提取子模块数据。


21
2018-01-16 18:39



注意 --recurse-submodules 和 --recursive 是 等效的别名。 - Joel Purra
如果您已经在父克隆回购中怎么办? - SuperUberDuper
在这种情况下你可以做@SuperUberDuper git submodule update --init --recursive 如中所述 这个答案 - Enrico


迟到的答案

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

因为我花了整整一个小时与朋友一起摆弄:即使你有BitBucket的管理员权限,也要克隆ORIGINAL存储库并使用拥有repo的人的密码。很恼火,发现你遇到了这个陷阱:P


17
2018-02-16 16:10



这正是我正在处理的事情。那么,你是说任何需要在具有子模块的bitbucket存储库上开发的人都必须使用存储库创建者的凭据吗?布莱什。 - jsleuth
@jsleuth似乎是这样 - 它很糟糕......我知道。 - kaiser
这听起来像个bug。你有没有向Bitbucket报告? - Mathias Bynens
@MathiasBynens您是否偶然发现了这个问题?这是一年半之后,我实际上不知道是否仍然如此。 - kaiser
它没有描述性地回答OP的问题,但详细说明了Bitbucket中一个无关的错误;顺便提一下,它可以缩短为“使用SSH密钥认证”。 - Treffynnon


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

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

根据Git团队的说法,这可以大大加快更新包含许多子模块的存储库。当使用--recurse-submodules而不使用新的--jobs选项时,Git将逐个获取子模块。

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


8
2018-04-06 12:07