如何克隆git存储库,以便它也克隆其子模块?
运行gitclone$REPO_URL只会创建空的子模块目录。
如何克隆git存储库,以便它也克隆其子模块?
运行gitclone$REPO_URL只会创建空的子模块目录。
当前回答
使用此命令克隆所有子模块的repo
git clone --recurse-submodules git@gitlab.staging-host.com:yourproject
更新所有子模块的代码
git submodule update --recursive --remote
其他回答
如何“git克隆”回购,包括其子模块?
(我把它作为一个独立的答案,因为我认为这在git中很重要)
可悲的是,但在很多情况下,那些不太知情的克隆人会错过外在的东西:
vc大便(https://github.com/dirk-thomas/vcstool)数字子报表(https://github.com/ingydotnet/git-subrepo)git链接(https://github.com/chronoxor/gil).gitsvnextmodule(由smartgit处理)。git外部(https://github.com/develer-staff/git-externals)git x模块(https://gitmodules.com/)等等
作为备份,无法创建裸克隆(--bare)+完全递归(--recursive)来镜像(--mirror)所有引用(而不仅仅是所有外部引用):使用--recursive和--bare克隆git存储库
因此,对于git,没有一种内置的方法可以完全接受外部依赖关系。这意味着没有一种方法可以完全备份任何随机git存储库。
我在GitHub存储库中遇到了同样的问题。我的帐户缺少SSH密钥。该过程是
生成SSH密钥向GitHub帐户添加新的SSH密钥
然后,您可以使用子模块克隆存储库(gitclone--递归YOUR-git-REPO-URL)
or
运行gitsubmodule init和gitsubmodule update以获取已克隆存储库中的子模块。
在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 --recurse-submodules https://github.com/chaconinc/YourProjectName
如果已安装,则:
$ cd YourProjectName (for the cases you are not at right directory)
$ 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子模块更新。