如何“git克隆”包括子模块?

How to “git clone” including submodules?

我想把一个子模块放到回购中。问题是,当我克隆父repo时,子模块文件夹完全是空的。

有没有办法让git clone parent_repo实际将数据放入子模块文件夹?

例如,http://github.com/cwolves/sequelize/tree/master/lib/,nodejs-mysql-native指向外部git子模块,但当我签出sequelize项目时,该文件夹为空。


对于git 2.13及更高版本,可以使用--recurse-submodules代替--recursive

1
2
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+版中可用):

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

对于Git和更高版本的1.6.5,您可以使用:

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

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

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


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

1
2
git submodule init
git submodule update


2010年原始答案

正如Joschi在评论中提到的,git submodule现在支持--recursive选项(git1.6.5及更多)。

If --recursive is specified, this command will recurse into the registered submodules, and update any nested submodules within.

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

With version 1.6.5 of git and later, you can do this automatically by cloning the super-project with the –-recursive option:

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

使用git 2.8更新2016:请参见"如何使用git clone --recursive加速/并行下载git子模块?"

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

1
git fetch --recurse-submodules -j2

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

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

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

1
2
git submodule init
git submodule update

如果在分支中添加了子模块,请确保将其包含在克隆命令中…

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

试试这个:

1
git clone --recurse-submodules

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


迟到的回答

1
2
// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://[email protected]/USERNAME/REPO.git DESTINATION_DIR

就像我花了一个小时和一个朋友闲逛一样:即使你对BitBucket有管理权限,也要克隆原始存储库并使用拥有repo的人的密码。当你发现自己遇到了这个雷区时很恼火:p


尝试在Git存储库中包含子模块。

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

1
git clone --recurse-submodules

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

1
git clone --recursive [email protected]:your_repo.git

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

1
git submodule foreach"git checkout master"

我想你可以走三步,

1
2
3
git clone
git submodule init
git submodule update

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

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

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

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


试试这个。

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

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