GIT--git clone fatal
1 介绍
1.1 原因分类
git clone fatal 原因可能很多:
- 网络问题
- 仓库地址错误
- 代理设置问题
- SSH协议问题
- SSL证书验证失败
- 路径过长
- 文件过大或网络不稳定
1.2 文件过大或网络不稳定
Cloning into 'hello-algo'...
remote: Enumerating objects: 76879, done.
remote: Counting objects: 100% (522/522), done.
remote: Compressing objects: 100% (318/318), done.
fatal: the remote end hung up unexpectedly71 MiB | 325.00 KiB/s
fatal: early EOF
fatal: index-pack failed
2 分析
- 克隆的仓库包含大量数据或分支。
- 网络连接不稳定或速度慢。
3 操作
3.1 指定克隆深度【浅克隆】
使用 --depth 选项克隆仓库的最近一次提交
git clone --depth 1 https://github.com/XXX/XXX.git
为1即表示只克隆指定分支最近一次commit,体积小,可解决项目过大导致Timeout的问题。
优点:限制 clone 的深度,不包括历史记录,提高克隆速度;
当指定depth克隆深度为1,即表示只克隆最近一次的commit;
适用于只要最新版本,不考虑历史记录的情况。
3.2 分批次下载
先使用 --depth 克隆部分数据,然后执行 git fetch --unshallow 来获取完整仓库。
3.3 增大Git的HTTP POST缓冲区大小
如 git config http.postBuffer 524288000(单位为字节)。
// 524288000 的单位代表 B,524288000B 也就是 500MB。
sudo git config http.postBuffer 5242880000
sudo git config https.postBuffer 5242880000
查看是否成功
git config --list | grep postbuffer
[user]
name = sen
email = sen@yocobot.com
[core]
compression = 0::
[http]
postBuffer = 1048576000
示例
git config --edit --global
点击Esc键,这一步的意思是vim准备接受命令了,然后 shift + :
,输入 q!
= 退出,wq
= 写入保存退出。
:q --退出(如果没有做任何操作,可以直接退出,如果修改内容,还没有保存,这样就退不了)
:q! --不保存退出(没有保存,就可直接退出了,也就是强退)
:wq --写入文件并退出
:wq! --强制写入,并退出(有些打开的文件是只读的,可以用这个命令)
3.4 配置git的最低速度和最低速度时间(单位:秒)
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999999
3.5 压缩
当执行clone指令时,服务器将压缩目标文件,再传输到客户端解压。core.compression取值范围[-1,9];-1是以zlib默认压缩,0不压缩,1-9是压缩速度与压缩后文件大小之间的权衡,数字越大,压缩越慢,得到的文件越小。
git config --global core.compression 0
root@hcss-ecs:/opt/worthsen# git config --global core.compression 0
root@hcss-ecs:/opt/worthsen# git config --list
core.compression=0
3.6 过滤下载 git filter branch
对于有大量错误提交的二进制垃圾或不再需要的旧资产的大型存储库,一个很好的解决方案是使用 git filter-branch。 该命令允许您遍历项目的整个历史记录,根据预定义的模式过滤、修改和跳过文件。
一旦你确定了你的仓库中哪些地方比较重,它就是一个非常强大的工具。有可用的帮助脚本来识别大对象,所以这部分应该很容易。
语法如下:
git filter-branch --tree-filter 'rm -rf [/path/to/spurious/asset/folder]'
不过, git filter-branch 有一个小缺点:一旦使用 filter-branch,您实际上就会重写项目的整个历史记录。也就是说,所有提交 ID 都会更改。这要求每个开发人员重新克隆更新后的存储库。
因此,如果您计划使用git filter-branch执行清理操作 ,您应该通知您的团队,在执行操作时计划短暂冻结,然后通知每个人应该再次克隆存储库。
3.7 仅克隆一个分支
从 git 1.7.10 开始,你还可以通过克隆单个分支来限制克隆的历史记录量,如下所示:
git clone [remote url] --branch [branch_name] --single-branch [folder]
如果您要处理长期运行且存在分歧的分支,或者您有大量分支但只需要处理其中的几个,那么这个特定的 hack 非常有用。如果您只有少数分支且差异很小,那么使用这个 hack 可能不会看到很大的差异。
4 其他
4.1 查看配置列表
git config --list
4.2 配置文件介绍
- system
系统级别,一般存放系统设置,作用范围最大
一般存放于[Git安装目录]\mingw64\etc\gitconfig,但是Git不会自动生成这个文件只有通过命令编辑文件后,该文件才会生成,编辑命令git config --system --edit - global
全局文件,整个系统用户范围内生效,作用范围比system小
配置文件不会自动生成,通过命令git config --global --edit编辑之后生成,位置默认在C:\Users\Administrator.gitconfig - local
每个仓库的配置文件,作用范围最小,只在本仓库生效
clone或者init时自动生成,位置在.git\config
注:既然配置文件有3种,那如果有一个属性,三种配置文件里都有配置,且各不相同,会取哪个属性呢?
答:作用范围越小的优先生效,这样可以为每个仓库每个用户做单独的配置
参考
1、git clone fatal: The remote end hung up unexpectedly early EOF index-pack failed 解决方案
2、stackoverflow–fatal: early EOF fatal: index-pack failed
3、大型仓库
4、Git实战笔记(一) 常见错误
5、【git学习】如何编辑git config --global的配置文件
6、git配置文件解析,配置命令详解