前言
由于国内网络环境的影响,我们从
github
clone
代码时,总是会出现
clone
失败的情况。当
clone
失败时,我们怎么处理解决呢?以下总结了三种解决办法,仅供参考交流。
1 clone事例
这里,我以获取乐鑫提供的软件库文件
ESP-IDF 仓库
。作为
clone
的事例,具体讲解当
clone
失败时,怎么解决问题。
获取
ESP-IDF
的本地副本:打开终端,切换到要保存
ESP-IDF
的工作目录,使用
git clone
命令克隆远程仓库。
打开终端,输入以下命令:
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
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
成功的代码,会自动跳过。
在网络状况良好的情况下,多尝试几次,基本就能
clone
成功。但是,也有可能出现下面的情况,我称之为“
假象 clone
”。
3 假象clone的处理方法
(1) 经过多次的重复
clone
子模块,
git
已经不再下载新的代码,貌似我们已经成功
clone
所有远端仓库;
(2) 我们再次输入本地分支状态查看命令,发现
git
提示了很多“不一致性”;
也就是说我们本地分支和远端分支还是不同,我们没有
clone
成功,可是为什么
clone
子模块的命令不再生效呢?
根据提示路径,我们可以找到不一致模块的文件夹,发现里面只有一个空目录。我们使用快捷键
CTRL+H
,发现文件夹里面有以 . 开头的隐藏文件(比如
.git
)。
这里我猜测
clone
命令不再有效的原因是:
.git
中记录该子模块的版本信息,所以当
git
命令,扫描到该子模块时,已经有文件夹和版本信息,所以不再
clone
,认为已经存在。(如果有同学知道这部分机制,欢迎评论留言)
(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
失败的时候,三种处理方法。推荐先尝试第三种方法,毕竟咱们的时间就是金钱。