ChatGPT解决这个技术问题 Extra ChatGPT

如何“git clone”包括子模块?

如何克隆 git 存储库以便它也克隆其子模块?

运行 git clone $REPO_URL 只会创建空的子模块目录。

该命令将是 git clone --recurse-submodules --remote-submodules(2019 年第三季度 Git 2.23):它将在一个命令中克隆并更新子模块。请参阅my edited answer below
您可能想离开 --remote-submodules 而只做 --recurse-submodules。谨防。
@BenjaminBerman 您能否详细说明为什么您不想使用git clone --recurse-submodules --remote-submodules
@LiamCrowley ,由于各种原因,父(托管,包含)回购可能取决于子模块的特定版本。例如,主机仓库的维护者可能还没有准备好处理更新。

M
Mathias Bynens

对于 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 存储库中将此行为指定为默认行为,以便信息较少的克隆器会自动获取初始化的子模块?
@NHDaly 可悲的是,不。 (至少我不知道。)
从逻辑上讲 git clone --recursive 也会填充子模块的任何子模块,对吗?
我想我每个月都会回到这个答案......为什么 git 在克隆时不问它是否也应该下载子模块?
另外要明确一点(因为我想知道并且除了查看源代码之外找不到答案), git clone --recursive--recurse-submodules 选项的行为相同。它们导致调用相同的函数。
L
LiraNuna

在填充子模块之前,您必须做两件事:

git submodule init 
git submodule update

我很害怕......这没有任何意义,因为在这种情况下你正在检查一个部分项目。我知道子模块更新不是自动的,但是为什么绑定的版本没有自动签出?有什么办法可以强制吗?我有一个包含 3 级子模块的项目,为了结帐而必须遍历那么远似乎很荒谬。
请阅读 git-submodule(1) 手册页 (kernel.org/pub/software/scm/git/docs/git-submodule.html)。您会发现 git submodule update 支持一个很好的参数,称为 --recursive
为什么不在一个命令中同时执行它们呢? git submodule update --init(另见 my answer)。
我认为最好用这两个命令来回答这个问题。它更好地解释了如何完成任务。
@MathiasBynens 我刚刚登录的一台机器只有 git 1.5.5.6,它显然不支持缩短的指令,但确实支持它作为两个命令。
V
VonC

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

正如评论中提到的 joschigit 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 花了 14 年才开始为子模块添加适当的支持,呵呵。感谢更新!如果我已经有一个没有子模块且没有记录 SHA1 的主仓库的克隆,并且我想提取每个子模块的最新版本怎么办。可行吗?
@VioletGiraffe 如果该克隆存储库具有子模块,则它具有“记录的 SHA1”。 git submodule update --init --recursive --remote 应该将它们更新为各自分支的最新提交。 (例如:stackoverflow.com/a/56981834/6309
让我用一个例子来澄清一下:我在 Github 上有一个使用子模块的模板项目,我什至将子模块的特定修订提交到这个模板仓库中。但是当我从这个 repo 创建一个新项目时,你列出的任何命令(clone --recurse-submodules --remote-submodulessubmodule update --init --recursive --remote 都没有)让我真正获取 subrepos。我得到的只是一个 .gitmodules 文件,除了手动克隆它们之外,我找不到任何方法来初始化子存储库。我想至少有一个脚本可以用 submodule foreach 来完成...
如果您知道解决方案,我会问一个您可以回答的单独问题。这是测试存储库,除了手动之外我找不到任何方法来初始化:github.com/VioletGiraffe/TEST
@VioletGiraffe 那是因为您添加并提交了 .gitmodules 而不是 gitlink(stackoverflow.com/a/16581096/6309,索引中的特殊条目:stackoverflow.com/a/19354410/6309)这是一个确实注册了正确 gitlink 的存储库:github.com/tiagomazzutti/antlr4dart
C
Community

[快速回答]

您可以使用此命令克隆包含所有子模块的 repo:

git clone --recursive YOUR-GIT-REPO-URL

或者,如果您已经克隆了项目,您可以使用:

git submodule init
git submodule update

在 git 版本 2.24.3 上,上面的命令给了我错误:错误:服务器不允许请求未公布的对象 e635630d55682951eb2da35630d5da15b6cc 在子模块路径“ui-library”中获取,但它不包含 e635630d55682951eb2da35630d5da15b6cc。直接获取该提交失败。
B
Benyamin Jafari

[快速回答]

克隆父仓库(包括一些子模块仓库)后,执行以下操作:

git submodule update --init --recursive

M
Mars Redwyne

如果您的子模块已添加到分支中,请务必将其包含在您的克隆命令中...

git clone -b <branch_name> --recursive <remote> <directory>

这更像是我正在寻找的......但是子模块将它们的分支列为“分离”。 :(
A
Antier Solutions

使用此命令克隆包含所有子模块的 repo

git clone --recurse-submodules git@gitlab.staging-host.com:yourproject

更新所有子模块的代码

git submodule update --recursive --remote

n
nweiler

尝试这个:

git clone --recurse-submodules

假设您已经将子模块添加到父项目,它会自动提取子模块数据。


请注意,--recurse-submodules--recursiveequivalent aliases
@SuperUberDuper 在这种情况下,您可以按照 this answer 中的说明执行 git submodule update --init --recursive
t
tro

我认为您可以执行 3 个步骤:

git clone
git submodule init
git submodule update

k
kaiser

迟到的答复

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

正如我刚刚花了整整一个小时和一个朋友摆弄一样:即使您对 BitBucket 拥有管理员权限,也请始终克隆原始存储库并使用拥有该存储库的人的密码。很烦人发现你遇到了这个陷阱:P


这正是我正在处理的问题。那么,您是说需要在具有子模块的 bitbucket 存储库上进行开发的任何人都必须使用存储库创建者的凭据?布莱赫。
@jsleuth 似乎是这样 - 这很糟糕......我知道。
这听起来像一个错误。你向 Bitbucket 报告了吗?
它没有描述性地回答 OPs 问题,而是详细说明了 Bitbucket 中一个不相关的错误;顺便说一句,可以将其缩写为“使用 SSH 密钥身份验证”。
在 Bitbucked 上仍未解决。我正在使用子模块的相对路径,作为一个技巧,我必须执行以下步骤:- git remote set-url origin git@bitbucket.org:namespace/main-repo.git - git submodule update --init --recursive
V
Vincent Beltman

您可以在克隆存储库时使用 --recursive 标志。此参数强制 git 克隆存储库中所有已定义的子模块。

git clone --recursive git@repo.org:your_repo.git

克隆后,有时子模块分支可能会改变,所以在它之后运行这个命令:

git submodule foreach "git checkout master"

4
4b0

试试这个在 git 存储库中包含子模块。

git clone -b <branch_name> --recursive <remote> <directory>

或者

git clone --recurse-submodules

R
Rajitha Udayanga

只需在您的项目目录中执行这些操作。

$ git submodule init
$ git submodule update

如果您之前已经克隆了您的存储库,那么这是正确的答案。
M
Mafii

子模块并行获取旨在通过一次获取多个存储库来减少获取存储库及其所有相关子模块所需的时间。这可以通过使用新的 --jobs 选项来完成,例如:

git fetch --recurse-submodules --jobs=4

根据 Git 团队的说法,这可以大大加快包含许多子模块的存储库的更新速度。当使用没有新的 --jobs 选项的 --recurse-submodules 时,Git 将一个一个地获取子模块。

来源:http://www.infoq.com/news/2016/03/git28-released


F
FatalError

对于 GitHub 存储库,我遇到了同样的问题。我的帐户缺少 SSH 密钥。过程是

生成 SSH 密钥 将新的 SSH 密钥添加到您的 GitHub 帐户

然后,您可以使用子模块 (git clone --recursive YOUR-GIT-REPO-URL) 克隆存储库

或者

运行 git submodule initgit submodule update 以获取已克隆存储库中的子模块。


是的,这是 Permission denied (publickey). fatal: Could not read from remote repository. 错误
n
nzrytmn

如果它是一个新项目,您可以这样做:

$ 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

4
4b0

尝试这个。

git clone -b <branch_name> --recursive <remote> <directory>

如果您在分支中添加了子模块,请确保将其添加到克隆命令中。


G
Gangbin chen

1.git子模块初始化 2.git子模块更新

或者也许 git stash -u git pull origin master git stash p


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
S
Suraj Rao
git submodule foreach git pull origin master