git 命令通过 HTTP 操作用 Gitlab 搭建的代码库出错

由于项目的需要近日升级了 MySQL 5.5,顺便也把 Gitlab 升级到了 6.7。结果今天在应用服务器上 git pull 的时候出现错误:

1
2
fatal: protocol error: bad line length character: 718
fatal: The remote end hung up unexpectedly

于是尝试了一下 git clone,也还是有错误:

1
fatal: protocol error: bad line length 8188

因为在我自己的电脑上 git 操作一切正常,而两个环境主要的区别就是连接 git 服务的协议,我的机器上用基于 sshgit 协议,而应用服务器上通过 http 协议访问服务。所以问题肯定是和 http 协议有关,于是开始查看 gitlab 的日志,但是看不出有什么问题,查看 Nginx 的日志也没有任何错误。

最后,经过一番搜索,找到了这个Issue
看来是和这个代码有关系。在这个代码里面,对原来直接返回的 block 内容用 encode_chunk 方法重新进行了封装,在原来的 block 前添加了一行块大小信息

由于我现在的 Nginx 是 1.0 的版本,这个版本默认是没有包含 chunking module 的,所以无法正确处理 chunked response,看来只要按大家说的升级 Nginx 就可以了。

我之前是直接通过 yum install 安装的 Nginx,而默认的 yum 封包库里只有 Nginx 1.0,所以我添加了 Webtatic 的封包库,然后卸载 Nginx 1.0,安装 Nginx 1.4。

1
2
3
4
5
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
service nginx stop
yum remove nginx
yum install nginx14
service nginx start

整个升级过程非常快,我事先还备份了 /etc/nginx,但是升级后发现配置文件都还在,而且启动 Nginx 1.4 十分顺利。再尝试 git pull,果然OK了!