如何 “git clone” 包括子模块?

我正在尝试将子模块放入存储库中。问题是当我克隆父仓库时,子模块文件夹完全为空。

有什么方法可以使git clone parent_repo实际上将数据放入子模块文件夹中吗?

例如, http : nodejs-mysql-native指向外部 git 子模块,但是当我检出sequelize项目时,该文件夹为空。

答案

在 Git 2.13 及更高版本中,可以使用--recurse-submodules代替--recursive

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

编者注: -j8是可选的性能优化,已在 2.8 版中提供,并且可以一次并行获取多达 8 -j8模块 - 请参阅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

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

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

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

git submodule init 
git submodule update

Git 2.23(Q3 2019):如果要克隆子模块并将其更新为最新版本,请执行以下操作:

git clone --recurse-submodules --remote-submodules

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

git clone --recurse-submodules

见下文。


原始答案 2010

正如joschi在评论中提到的那样, git submodule现在支持--recursive选项(Git1.6.5 及更高版本)。

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

有关 init 部分,请参见递归使用 git 子模块
有关更多信息,请参见git submodule

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

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

使用 git 2.8 更新 2016:请参阅 “ 如何使用git clone --recursive加快 / 并行化 git 子模块的下载?

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

git fetch --recurse-submodules -j2

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

参见Ben Avison(``) 提交 4c69101 (2019 年 5 月 19 日
(由Junio C gitster - gitstercommit 9476094 中合并 ,2019 年 6 月 17 日)

clone :添加--remote-submodules标志

当使用git clone --recurse-submodules ,对于您希望子模块在其远程跟踪分支而不是通过它们检出的任何用例,以前无法将--remote开关传递给隐式git submodule update命令。记录在超级项目中的 SHA-1。

此补丁纠正了这种情况。
实际上,它也会通过--no-fetch传递到git submodule update ,因为它们只是刚刚克隆了子模块,因此再次从远程获取仅会减慢速度。

这意味着:

--[no-]remote-submodules:

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

[快速回答]

您可以使用以下命令克隆所有子模块的仓库:

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

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

git submodule init
git submodule update

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

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

尝试这个:

git clone --recurse-submodules

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

我认为您可以执行 3 个步骤:

git clone
git submodule init
git submodule update

迟来的答案

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

正如我整整整整花了一个小时摆弄一个朋友:即使您对 BitBucket 拥有管理员权限,也请始终克隆 ORIGINAL 存储库,并使用拥有该存储库的密码。烦人的发现您遇到了这个陷阱:P

尝试将此操作包含在 git 存储库中。

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

要么

git clone --recurse-submodules

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

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

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

git submodule foreach "git checkout master"