如何克隆git存储库,以便它也克隆其子模块?
运行gitclone$REPO_URL只会创建空的子模块目录。
如何克隆git存储库,以便它也克隆其子模块?
运行gitclone$REPO_URL只会创建空的子模块目录。
当前回答
您可以从github复制克隆url
然后使用:git clone—递归
其他回答
试试这个。
git clone -b <branch_name> --recursive <remote> <directory>
如果在分支中添加了子模块,请确保将其添加到clone命令中。
在填充子模块之前,您必须做两件事:
git submodule init
git submodule update
克隆存储库时,可以使用--recursive标志。此参数强制git克隆存储库中所有已定义的子模块。
git clone --recursive git@repo.org:your_repo.git
克隆后,有时子模块分支可能会发生更改,因此在其之后运行以下命令:
git submodule foreach "git checkout master"
只需在项目目录中执行这些操作。
$ git submodule init
$ git submodule update
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子模块更新。