git submodule update --init --recursive失败的处理办法

简介: git submodule update --init --recursive失败的处理办法

前言

由于国内网络环境的影响,我们从 github clone 代码时,总是会出现 clone 失败的情况。当 clone失败时,我们怎么处理解决呢?以下总结了三种解决办法,仅供参考交流。


1 clone事例

这里,我以获取乐鑫提供的软件库文件 ESP-IDF 仓库。作为 clone 的事例,具体讲解当 clone 失败时,怎么解决问题。

获取 ESP-IDF 的本地副本:打开终端,切换到要保存 ESP-IDF 的工作目录,使用 git clone 命令克隆远程仓库。

打开终端,输入以下命令:

1. mkdir -p ~/esp
2. cd ~/esp
3. git clone --recursive https://github.com/espressif/esp-idf.git

ac0d13427baf4dc18713b4a3ffc21cee.png

ESP-IDF 将下载至 ~/esp/esp-idf。

2 Failed to clone

受到网络环境的影响,代码一次性克隆成功,基本属于中彩票。经常会出现子模块 clone 失败的情况。即报错:Failed to clone...

这种问题,大多由于网络不稳定或者无法访问 github 子模块网络,我们首先多尝试 clone几次(说不定网络稳定一会儿,就能 clone 成功),具体步骤如下:

(1) 切换到 esp-idf 代码目录下;

cd esp-idf/

(2) 查看当前本地分支状态;

git status

git 会提示,当前本地分支与远程分支的不一致性(红色字体部分),也就是我们 clone 失败的具体组件部分。

(3) 我们再次输入子模块更新下载指令,尝试从远端仓库 clone 代码;

git submodule update --init --recursive

不用担心重复下载,已经 clone 成功的代码,会自动跳过

dce2fc82b6d545e2a47cf69e8b957746.png

在网络状况良好的情况下,多尝试几次,基本就能 clone 成功。但是,也有可能出现下面的情况,我称之为“假象 clone”。

3 假象clone的处理方法

(1) 经过多次的重复 clone 子模块,git 已经不再下载新的代码,貌似我们已经成功 clone 所有远端仓库;

(2) 我们再次输入本地分支状态查看命令,发现 git 提示了很多“不一致性”;

也就是说我们本地分支和远端分支还是不同,我们没有 clone 成功,可是为什么 clone 子模块的命令不再生效呢?

根据提示路径,我们可以找到不一致模块的文件夹,发现里面只有一个空目录。我们使用快捷键 CTRL+H,发现文件夹里面有以 . 开头的隐藏文件(比如 .git)。

这里我猜测 clone 命令不再有效的原因是:.git 中记录该子模块的版本信息,所以当 git 命令,扫描到该子模块时,已经有文件夹和版本信息,所以不再 clone,认为已经存在。(如果有同学知道这部分机制,欢迎评论留言)


image.png

(3) 既然 git 扫描的依据是:文件夹 + .git,那么我们将不一致模块的最后一级文件夹删除即可;

(4) 删除以后,再次输入更新下载子模块的命令;

git submodule update --init --recursive

可以看到,刚才删除的子模块再次被下载,并切换到相应的最新分支。

(5) 最后,输入查看本地分支状态的命令;

git status

提示:nothing to commit,working tree clean.

翻译过来的意思就是:没有需要提交的代码,本地工作的树很干净,和远端仓库代码一致。

至此,通过以上两种办法的交替,多次使用,基本能 clone 成功,就是比较耗费时间。

4 网络问题

有些代码,经过以上两种办法还是无法 clone 成功。那没办法了,基本就是网络问题。

这里推荐大家一个小工具(科学上网),作者亲自尝试以后,基本能访问 google 和 YouTube,说明效果还是不错的。

总结

以上就是 git submodule update --init --recursive 失败的时候,三种处理方法。推荐先尝试第三种方法,毕竟咱们的时间就是金钱。


相关文章
|
4月前
|
存储 Shell 开发工具
git init 执行后发生了什么?
首先在磁盘中创建一个新目录 Git,进入该目录后执行 `git init` 初始化。这个时候目录下会创建一个隐藏目录 ./git,这个./git 目录叫做 Git 版本库或者仓库
28 0
git init 执行后发生了什么?
|
6月前
|
开发工具 git
Git添加子模块(submodule)
Git添加子模块(submodule)
142 0
|
16天前
|
Linux 开发工具 git
还不会 Git 子模块操作?一文教你学会 git submodule 的增、删、改、查!
还不会 Git 子模块操作?一文教你学会 git submodule 的增、删、改、查!
|
3月前
|
项目管理 开发工具 git
「译文」Git subtree: Git submodule 的替代品
「译文」Git subtree: Git submodule 的替代品
「译文」Git subtree: Git submodule 的替代品
|
3月前
|
存储 Linux 开发工具
「译文」使用 submodule 和 subtree 管理 Git 项目
「译文」使用 submodule 和 subtree 管理 Git 项目
|
3月前
|
存储 开发工具 git
将 git 仓库从 submodule 转换为 subtree
将 git 仓库从 submodule 转换为 subtree
|
6月前
|
开发工具 git
git push origin master提交报错解决办法
git push origin master提交报错解决办法
78 0
|
项目管理 开发工具 git
Git学习笔记(三) git submodule
Git学习笔记(三) git submodule
125 0
|
开发工具 git
git init之后怎么关联github远程仓库拉取代码
git init之后怎么关联github远程仓库拉取代码
166 0
git init之后怎么关联github远程仓库拉取代码
|
开发工具 git
Can‘t find third_party/gtest. Run git submodule update --init, or disable with CMake -DBUILD_TEST
Can‘t find third_party/gtest. Run git submodule update --init, or disable with CMake -DBUILD_TEST
101 0