如何克隆git存储库,以便它也克隆其子模块?
运行gitclone$REPO_URL只会创建空的子模块目录。
如何克隆git存储库,以便它也克隆其子模块?
运行gitclone$REPO_URL只会创建空的子模块目录。
当前回答
在Git 2.13及更高版本中,可以使用--recurse子模块代替--recursive:
git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar
编者注:-j8是一种可选的性能优化,在2.8版中提供,并且一次并行获取最多8个子模块——参见man git clone。
Git 1.9版至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
对于已克隆的repo或较旧的Git版本,请使用:
git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive
其他回答
试试这个。
git clone -b <branch_name> --recursive <remote> <directory>
如果在分支中添加了子模块,请确保将其添加到clone命令中。
子模块并行获取旨在通过同时获取多个存储库来减少获取存储库及其所有相关子模块所需的时间。这可以通过使用新的--jobs选项来完成,例如:
git fetch --recurse-submodules --jobs=4
根据Git团队的说法,这可以大大加快包含许多子模块的存储库的更新速度。当在没有新的--jobs选项的情况下使用--recurse子模块时,Git将逐个获取子模块。
资料来源:http://www.infoq.com/news/2016/03/git28-released
在填充子模块之前,您必须做两件事:
git submodule init
git submodule update
1.git子模块初始化2位子模块更新
或者可能git存储-ugit拉动原点主机数字存储p
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子模块更新。