解决Gitlab的The remote end hung up unexpectedly错误

本文详细介绍了在使用GitLab服务器环境(CentOS7+Gitlab7.2.1)时遇到的Git pull操作报错的问题。通过分析错误日志,发现是Ruby误认为超时中断导致的。解决办法是调整unicorn的timeout参数,最终成功解决了客户端的Git pull或clone问题。

Gitlab服务器环境是CentOS7+Gitlab7.2.1,最近发现在开发机上使用git pull更新文件时,会报如下错误。

fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: unpack-objects failed

使用git clone重新checkout源也受到影响,长时间checkout不出来,

Google了半天也没找到个好办法,最后还是查错误日志定位到了问题

在/var/log/gitlab/unicorn/unicorn_stderr.log中,发现如下的错误信息

E, [2014-12-06T09:13:10.319216 #11074] ERROR -- : worker=0 PID:11091 timeout (31s > 30s), killing
E, [2014-12-06T09:13:10.336186 #11074] ERROR -- : reaped #<Process::Status: pid 11091 SIGKILL (signal 9)> worker=0
I, [2014-12-06T09:13:10.340379 #11183]  INFO -- : worker=0 spawned pid=11183
I, [2014-12-06T09:13:10.340848 #11183]  INFO -- : worker=0 read

看来是被Ruby误认为超时中断了。解决办法就是调大unicorn的timeout值。

修改/var/opt/gitlab/gitlab-rails/etc/unicorn.rb,将

# What the timeout for killing busy workers is, in seconds
timeout 30
改为

# What the timeout for killing busy workers is, in seconds
timeout 60


最后,运行

sudo systemctl restart gitlab-runsvdir.service 

重启Gitlab。


之后客户端就可以正常Git pull或者clone了









### 常见问题与解决方案 在使用 `git clone` 时,出现 **fatal: the remote end hung up unexpectedly** 错误,通常与网络连接、缓冲区限制或服务器端行为有关。以下为具体原因及解决方法: #### 增加 Git 缓冲区大小 Git 默认的 `postBuffer` 大小为 1 MiB,对于大型仓库可能不够。可以通过以下命令将缓冲区设置为 500 MB: ```bash git config --global http.postBuffer 524288000 ``` 此设置适用于大多数大型仓库克隆需求[^4]。 #### 设置最低传输速度与时间限制 在克隆过程中,如果网络速度低于一定阈值,Git 会主动中断连接。可以通过以下命令设置最低速度和最低速度时间,防止因网络波动中断: ```bash git config --global http.lowSpeedLimit 0 git config --global http.lowSpeedTime 999999 ``` 此配置允许 Git 在低速连接下持续更长时间,从而完成克隆操作[^1]。 #### 关闭压缩或调整压缩级别 压缩过程可能增加传输时间,影响连接稳定性。可以通过以下命令关闭压缩或使用默认压缩库: ```bash git config --global core.compression -1 ``` 该设置有助于提升传输效率,尤其适用于网络条件较差的环境[^5]。 #### 使用浅层克隆(Shallow Clone) 如果只需要最新的提交记录,可以先进行浅层克隆,成功后再拉取完整历史记录: ```bash git clone --depth=1 http://xxx.git cd xxx git fetch --unshallow ``` 此方法适用于网络条件较差或仓库体积较大的情况[^3]。 #### 更换协议或使用 SSH 使用 HTTPS 协议时更容易遇到此类问题,可以尝试切换为 SSH 协议进行克隆。确保已配置 SSH 密钥并添加到 Git 账户中: ```bash git clone git@github.com:username/repo.git ``` SSH 协议通常比 HTTPS 更稳定,尤其适用于频繁的 Git 操作。 #### 降低 Git 的并发线程数 某些情况下,Git 的并发传输线程过多可能导致服务器压力过大而中断连接。可以通过以下命令限制并发线程数: ```bash git config --global pack.threads 1 ``` 此设置可减少服务器负载,提升连接稳定性。 #### 检查网络环境 确保本地网络连接稳定。可以尝试更换网络环境(如从公司网络切换到家庭网络)或联系网络管理员检查是否存在代理或防火墙限制。 #### 使用代理或镜像 在国内访问 GitHub 或 GitLab 时,由于网络延迟或限制,建议使用代理或配置国内镜像源加速访问。例如,使用 `git clone` 时指定代理: ```bash git config --global http.proxy 'socks5://127.0.0.1:1080' ``` 或使用国内镜像站点(如 Gitee)进行同步克隆。 #### 更新 Git 客户端 确保使用的 Git 客户端为最新版本。旧版本的 Git 可能在处理 HTTP/2 或大文件传输时存在兼容性问题。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值