如何克隆git存储库,以便它也克隆其子模块?
运行git clone $REPO_URL只是创建空的子模块目录。
git clone $REPO_URL
在填充子模块之前,您必须做两件事:
git submodule initgit submodule update
Git 2.23(2019年第三季度):如果您想克隆和,请将子模块更新到最新版本:
git clone --recurse-submodules --remote-submodules
如果您只是想在记录的SHA1中克隆它们:
git clone --recurse-submodules
见下文。
请注意,Git 2.29(2020年第四季度)对子模块处理进行了重大优化。
见提交a462bee(2020年9月6日)byOrgad Chaneh(#0)。(由提交2ce9d4e中的Junio C Hamano----#0----合并,2020年9月18日)
#0:禁止检查文件名和对象id的ref歧义署名:Orgad SHANEH
署名:Orgad SHANEH
collect_changed_submodules()的artv参数只包含对象id(所有引用的对象引用)。通过传递assume_dashdash,通知setup_revisions()输入不是文件名,因此它可以避免每个引用的冗余统计信息。还要抑制refname_ambiguity标志以避免对每个对象进行文件系统查找。类似的逻辑可以在cat文件、包对象等中找到。这种变化减少了时间为#0(man)在我的存储库从25s到6s。
collect_changed_submodules()的artv参数只包含对象id(所有引用的对象引用)。
collect_changed_submodules()
通过传递assume_dashdash,通知setup_revisions()输入不是文件名,因此它可以避免每个引用的冗余统计信息。
assume_dashdash,
setup_revisions()
还要抑制refname_ambiguity标志以避免对每个对象进行文件系统查找。类似的逻辑可以在cat文件、包对象等中找到。
refname_ambiguity
这种变化减少了时间为#0(man)在我的存储库从25s到6s。
2010年原答复
正如joschi在评论中提到的,#0现在支持--recursive选项(Git1.6.5及更多)。
--recursive
如果指定了--recursive,则此命令将递归到已注册的子模块中,并更新其中的任何嵌套子模块。
初始化部分见递归地使用git子模块。#0解释更多
在git 1.6.5及更高版本中,您可以通过使用–-recursive选项克隆超级项目来自动执行此操作:
–-recursive
git clone --recursive git://github.com/mysociety/whatdotheyknow.git
2016年更新,git 2.8:参见“如何使用#0加速/并行化git子模块的下载?”
您可以使用多个线程并行启动获取子模块。例如:
git fetch --recurse-submodules -j2
更好的是,使用Git 2.23(2019年第三季度),您可以在一个命令中将子模块克隆并签出到他们的跟踪分支!
见提交4c69101(2019年5月19日)byBen Avison(#0)。(由提交9476094中的Junio C Hamano----#0----合并,2019年6月17日)
clone:添加--remote-submodules标志
clone
--remote-submodules
当使用git clone --recurse-submodules时,以前没有办法将--remote开关传递给隐式git submodule update命令您希望子模块在其上签出的任何用例远程跟踪分支,而不是超级项目中记录的SHA-1。
--remote
git submodule update
此补丁纠正了这种情况。它实际上也传递--no-fetch到git submodule update,因为它们的子模块刚刚被克隆,所以再次从远程获取只会减慢速度。
--no-fetch
这意味着:
--[no-]remote-submodules:
所有被克隆的子模块将使用子模块的远程跟踪分支的状态来更新子模块,而不是超级项目记录的SHA-1。等效于传递--remote到git submodule update。
在Git 2.13及更高版本中,可以使用--recurse-submodules代替--recursive:
--recurse-submodules
git clone --recurse-submodules -j8 git://github.com/foo/bar.gitcd bar
编者注:-j8是一个可选的性能优化,在2.8版中可用,并且一次并行获取多达8个子模块-请参阅man git-clone。
-j8
man git-clone
从Git的1.9版到2.12版(-j标志仅在2.8+版中可用):
-j
git clone --recursive -j8 git://github.com/foo/bar.gitcd bar
使用Git 1.6.5及更高版本,您可以使用:
git clone --recursive git://github.com/foo/bar.gitcd bar
对于已经克隆的repos或较旧的Git版本,请使用:
git clone git://github.com/foo/bar.gitcd bargit submodule update --init --recursive
如果您的子模块被添加到分支中,请务必将其包含在您的克隆命令中…
git clone -b <branch_name> --recursive <remote> <directory>
试试这个:
假设您已经将子模块添加到父项目中,它会自动提取子模块数据。
迟来的回答
// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORYgit clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR
就像我刚刚花了整整一个小时和一个朋友闲逛一样:即使你在BitBucket上拥有管理员权限,也要始终克隆原始存储库并使用拥有存储库的人的密码。
子模块并行获取旨在通过启用一次获取多个存储库来减少获取存储库及其所有相关子模块所需的时间。这可以通过使用新的--作业选项来完成,例如:
git fetch --recurse-submodules --jobs=4
根据Git团队的说法,这可以大大加快更新包含许多子模块的存储库的速度。当使用没有new--作业选项的--的子模块时,Git会一个接一个地获取子模块。
来源:http://www.infoq.com/news/2016/03/git28-released
您可以使用此命令使用所有子模块克隆您的repo:
git clone --recursive YOUR-GIT-REPO-URL
或者,如果您已经克隆了项目,则可以使用:
尝试在git存储库中包含子模块。
或
试试这个。
如果您在分支中添加了子模块,请确保将其添加到clone命令中。
我认为你可以用三个步骤:
git clonegit submodule initgit submodule update
您可以在克隆存储库时使用--recursive标志。此参数强制git克隆存储库中所有定义的子模块。
git clone --recursive git@repo.org:your_repo.git
克隆后,有时子模块分支可能会更改,因此在它之后运行此命令:
git submodule foreach "git checkout master"
克隆父仓库(包括一些子模块仓库)后,执行以下操作:
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
我在GitHub存储库中遇到了同样的问题。我的帐户缺少SSH密钥。该过程是
然后,您可以使用子模块克隆存储库(git clone --recursive YOUR-GIT-REPO-URL)
运行git submodule init和git submodule update以获取已经克隆的存储库中的子模块。
git submodule init
只需在您的项目目录中执行这些操作。
$ git submodule init$ git submodule update
使用此命令将repo与所有子模块克隆
git clone --recurse-submodules git@gitlab.staging-host.com:yourproject
更新所有子模块的代码
git submodule update --recursive --remote
git submodule foreach git pull origin master
初始化1.git子模块2.git子模块更新
或者git stash-u开发工具git拉取原始主机git stash p
我如何"git克隆"一个仓库,包括它的子模块?
(我把它作为一个独立的答案,因为我认为这在git中很重要)
可悲的是,但有很多情况下,less-informed cloners无论如何都会错过外部:
less-informed cloners
vcstool
git-subrepo
git links
.gitsvnextmodules
smartgit
因此,使用git没有一种内置的方法可以绝对完全地获取外部依赖项。这意味着没有一种方法可以绝对完全备份任何随机git存储库。
如果子模块是私有子模块,您可以使用凭证存储,以便它也递归地克隆其私有子模块。
USER=${GITHUB_ACTOR}TOKEN=$\{\{ secrets.JEKYLL_GITHUB_TOKEN }} git config --global credential.helper storeecho "https://${USER}:${TOKEN}@github.com" > ~/.git-credentials git clone --recurse-submodules -j8 git://github.com/foo/bar.gitcd bar
我用它来克隆我的子模块,其中私有模块在第五层深中。请允许我向您展示它是如何运作的: