如何克隆 git 存储库以便它也克隆其子模块?
运行 git clone $REPO_URL
只会创建空的子模块目录。
git clone --recurse-submodules --remote-submodules
(2019 年第三季度 Git 2.23):它将在一个命令中克隆并更新子模块。请参阅my edited answer below。
--remote-submodules
而只做 --recurse-submodules
。谨防。
git clone --recurse-submodules --remote-submodules
?
对于 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
。
使用 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
对于已克隆的存储库或较旧的 Git 版本,请使用:
git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive
在填充子模块之前,您必须做两件事:
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
(另见 my answer)。
Git 2.23(2019 年第三季度):如果您想克隆子模块并将其更新到最新版本:
git clone --recurse-submodules --remote-submodules
如果您只想在他们记录的 SHA1 中克隆它们:
git clone --recurse-submodules
见下文。
请注意,Git 2.29(2020 年第四季度)对子模块处理进行了重大优化。
请参阅 Orgad Shaneh (orgads
) 的commit a462bee(2020 年 9 月 6 日)。
(由 Junio C Hamano -- gitster
-- 在 commit 2ce9d4e 中合并,2020 年 9 月 18 日)
子模块:禁止检查对象 ID 的文件名和引用歧义 签名者:Orgad Shaneh
collect_changed_submodules() 的 argv 参数仅包含对象 ID(所有 ref 的对象引用)。通过传递assume_dashdash通知 setup_revisions() 输入不是文件名,因此它可以避免每个 ref 的冗余统计。还抑制 refname_ambiguity 标志以避免每个对象的文件系统查找。类似的逻辑可以在 cat-file、pack-objects 等中找到。此更改将我的仓库中 git fetch(man) 的时间从 25 秒减少到 6 秒。
原始答案 2010
正如评论中提到的 joschi,git submodule
现在支持 --recursive
选项(Git1.6.5 及更高版本)。
如果指定了 --recursive,该命令将递归到已注册的子模块中,并更新其中的任何嵌套子模块。
请参阅 Working with git submodules recursively 了解初始化部分。
请参阅 git submodule
explained 了解更多信息。
使用 git 1.6.5 及更高版本,您可以通过使用 --recursive 选项克隆超级项目来自动执行此操作:
git clone --recursive git://github.com/mysociety/whatdotheyknow.git
2016 年更新,使用 git 2.8:请参阅“How to speed up / parallelize downloads of git submodules using git clone --recursive
?”
您可以使用多个线程并行启动获取子模块。为实例:
git fetch --recurse-submodules -j2
更好的是,使用 Git 2.23(2019 年第三季度),您可以通过一个命令将子模块克隆并签出到其跟踪分支!
请参阅 Ben Avison (bavison
) 的commit 4c69101(2019 年 5 月 19 日)。
(由 Junio C Hamano -- gitster
-- 在 commit 9476094 中合并,2019 年 6 月 17 日)
克隆:添加 --remote-submodules 标志
使用 git clone --recurse-submodules 时,以前无法将 --remote 开关传递给隐式 git submodule update 命令,以适用于您希望在其远程跟踪分支上签出子模块而不是使用的任何用例超级项目中记录的 SHA-1。
这个补丁纠正了这种情况。它实际上也将 --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
都没有)让我真正获取 subrepos。我得到的只是一个 .gitmodules 文件,除了手动克隆它们之外,我找不到任何方法来初始化子存储库。我想至少有一个脚本可以用 submodule foreach
来完成...
[快速回答]
您可以使用此命令克隆包含所有子模块的 repo:
git clone --recursive YOUR-GIT-REPO-URL
或者,如果您已经克隆了项目,您可以使用:
git submodule init
git submodule update
[快速回答]
克隆父仓库(包括一些子模块仓库)后,执行以下操作:
git submodule update --init --recursive
如果您的子模块已添加到分支中,请务必将其包含在您的克隆命令中...
git clone -b <branch_name> --recursive <remote> <directory>
使用此命令克隆包含所有子模块的 repo
git clone --recurse-submodules git@gitlab.staging-host.com:yourproject
更新所有子模块的代码
git submodule update --recursive --remote
尝试这个:
git clone --recurse-submodules
假设您已经将子模块添加到父项目,它会自动提取子模块数据。
git submodule update --init --recursive
我认为您可以执行 3 个步骤:
git clone
git submodule init
git submodule update
迟到的答复
// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR
正如我刚刚花了整整一个小时和一个朋友摆弄一样:即使您对 BitBucket 拥有管理员权限,也请始终克隆原始存储库并使用拥有该存储库的人的密码。很烦人发现你遇到了这个陷阱:P
- git remote set-url origin git@bitbucket.org:namespace/main-repo.git
- git submodule update --init --recursive
您可以在克隆存储库时使用 --recursive
标志。此参数强制 git 克隆存储库中所有已定义的子模块。
git clone --recursive git@repo.org:your_repo.git
克隆后,有时子模块分支可能会改变,所以在它之后运行这个命令:
git submodule foreach "git checkout master"
试试这个在 git 存储库中包含子模块。
git clone -b <branch_name> --recursive <remote> <directory>
或者
git clone --recurse-submodules
只需在您的项目目录中执行这些操作。
$ git submodule init
$ git submodule update
子模块并行获取旨在通过一次获取多个存储库来减少获取存储库及其所有相关子模块所需的时间。这可以通过使用新的 --jobs 选项来完成,例如:
git fetch --recurse-submodules --jobs=4
根据 Git 团队的说法,这可以大大加快包含许多子模块的存储库的更新速度。当使用没有新的 --jobs 选项的 --recurse-submodules 时,Git 将一个一个地获取子模块。
来源:http://www.infoq.com/news/2016/03/git28-released
对于 GitHub 存储库,我遇到了同样的问题。我的帐户缺少 SSH 密钥。过程是
生成 SSH 密钥 将新的 SSH 密钥添加到您的 GitHub 帐户
然后,您可以使用子模块 (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 --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 clone -b <branch_name> --recursive <remote> <directory>
如果您在分支中添加了子模块,请确保将其添加到克隆命令中。
1.git子模块初始化 2.git子模块更新
或者也许 git stash -u git pull origin master git stash p
git submodule foreach git pull origin master
不定期副业成功案例分享
--recursive
和--recurse-submodules
选项的行为相同。它们导致调用相同的函数。