我正在尝试将子模块放入存储库中。问题是当我克隆父仓库时,子模块文件夹完全为空。
有什么方法可以git clone parent_repo
将数据实际放入子模块文件夹中吗?
例如,http://github.com/cwolves/sequelize/tree/master/lib/,nodejs-mysql-native
指向在外部git的子模块,但是当我结账的sequelize
项目,该文件夹为空。
我正在尝试将子模块放入存储库中。问题是当我克隆父仓库时,子模块文件夹完全为空。
有什么方法可以git clone parent_repo
将数据实际放入子模块文件夹中吗?
例如,http://github.com/cwolves/sequelize/tree/master/lib/,nodejs-mysql-native
指向在外部git的子模块,但是当我结账的sequelize
项目,该文件夹为空。
Answers:
在Git 2.13及更高版本中,--recurse-submodules
可以代替--recursive
:
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
对于已经克隆的仓库或较旧的Git版本,请使用:
git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive
master
?
在填充子模块之前,您必须做两件事:
git submodule init
git submodule update
git-submodule(1)
手册页(kernel.org/pub/software/scm/git/docs/git-submodule.html)。您会发现它git submodule update
支持名为的漂亮参数--recursive
。
git submodule update --init
(另请参阅我的回答)。
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子模块的下载git clone --recursive
? ”
您可以并行使用多个线程来启动获取子模块。
为实例:
git fetch --recurse-submodules -j2
更好的是,使用Git 2.23(2019年第三季度),您可以在一个命令中将子模块克隆并签出到其跟踪分支!
参见Ben Avison()提交4c69101(2019年5月19日)。(由Junio C Hamano合并--在commit 9476094中,2019年6月17日)bavison
gitster
clone
:添加--remote-submodules
标志在使用时
git clone --recurse-submodules
,对于希望子模块在其远程跟踪分支上而不是在超级项目中记录的SHA-1检出的任何用例,以前都没有办法将--remote
切换传递给隐式git submodule update
命令。此补丁纠正了这种情况。
实际上--no-fetch
,git submodule update
它也基于子模块刚刚被克隆的原因而传递,因此再次从远程进行获取只会减慢速度。
这意味着:
--[no-]remote-submodules:
克隆的所有子模块将使用子模块的远程跟踪分支的状态来更新子模块,而不是超级项目的已记录SHA-1。等同于传递
--remote
给git submodule update
。
git submodule update --init --recursive --remote
应将它们更新为各自分支的最新提交。(例如:stackoverflow.com/a/56981834/6309)
clone --recurse-submodules --remote-submodules
是submodule update --init --recursive --remote
)都不允许我实际获取该子存储库。我得到的只是一个.gitmodules文件,除了手动逐个克隆子存储库之外,我找不到其他方法来初始化子存储库。我想至少要有一个脚本来做submodule foreach
...
迟来的答案
// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR
正如我整整花了一个小时摆弄一个朋友一样:即使您对BitBucket拥有管理员权限,也请始终克隆ORIGINAL存储库并使用拥有该存储库的密码。烦人的发现您遇到了这个陷阱:P
--recursive
克隆存储库时可以使用该标志。此参数强制git克隆存储库中所有已定义的子模块。
git clone --recursive git@repo.org:your_repo.git
克隆后,有时可能会更改子模块分支,因此请在其后运行以下命令:
git submodule foreach "git checkout master"
克隆父仓库(包含一些子模块仓库)后,请执行以下操作:
git submodule update --init --recursive
子模块并行获取旨在通过一次启用多个存储库来减少获取存储库及其所有相关子模块所需的时间。这可以通过使用新的--jobs选项来完成,例如:
git fetch --recurse-submodules --jobs=4
根据Git小组的说法,这可以大大加快更新包含许多子模块的存储库的速度。在不使用新的--jobs选项的情况下使用--recurse-submodules时,Git将一一读取子模块。
我对GitHub存储库有同样的问题。我的帐户缺少SSH密钥。这个过程是
然后,您可以使用子模块(git clone --recursive YOUR-GIT-REPO-URL
)克隆存储库
要么
运行git submodule init
并git submodule update
在已克隆的存储库中获取子模块。
Permission denied (publickey). fatal: Could not read from remote repository.
错误的
尝试这个。
git clone -b <branch_name> --recursive <remote> <directory>
如果已将子模块添加到分支中,请确保将其添加到clone命令。
git clone --recurse-submodules --remote-submodules
(Q3 2019 Git 2.23):它将在一个命令中克隆和更新子模块。请参阅下面我编辑的答案。