Gitea 仓库无法 Push(HTTP receive-pack 返回空响应)排查清单

现象时间:2026-08-18
服务器:127.0.0.1:3000(Gitea 1.25.2),仓库 **/BigData

一、现象(客户端报错)

git push 报:

send-pack: unexpected disconnect while reading sideband packet
fatal: the remote end hung up unexpectedly

二、已排查排除的项(客户端侧)

  • git 版本 2.47.0.windows.2,http.postBuffer 已设 1GB,http.version=HTTP/1.1
  • 认证正常:先 401,带 Basic 凭据重试后 200 ✓(账号 **
  • 仓库写权限正常:Gitea API 返回 permissions: {admin:true, push:true, pull:true}
  • 无分支保护规则(branch_protections: [])✓
  • 推送内容极小:1 个提交 / 3 个对象 / 1652 字节 ✓

三、核心证据(服务端问题定位)

  • git push 过程中:POST /**/BigData.git/git-receive-pack 返回 HTTP 200 但 Content-Length: 0(空响应体),客户端因此判定断连。
  • 用 curl 直接 POST 该端点(空包)同样返回 200, 0 bytes
  • 结论:Gitea 服务端执行 git receive-pack --stateless-rpc 时没有任何输出(正常服务端会返回 git 协议字节流或明确的错误包)。GET 类操作(ls-remote/clone/fetch)正常,仅写入(receive-pack)受影响。

四、服务端排查步骤(按优先级)

1. 看 Gitea 日志(最可能直接给出答案)

# 常见位置二选一
tail -200 /var/log/gitea/gitea.log | grep -iE "error|panic|receive|hook" 
journalctl -u gitea --since "2026-08-18 11:2" -n 200

重点:Push 时间点(北京时间 2026-08-18 11:26 左右)附近有没有
Failed to run git receive-pack / update: hook / panic 之类的记录。

2. 检查服务器 git 环境

which git && git --version
su gitea -s /bin/bash -c 'git --version'   # 确认 Gitea 运行用户能执行 git
# app.ini 里的 git 配置
grep -A5 -iE "^\[git\]" /etc/gitea/app.ini

确认 [git] 段没有指向错误的 git 路径,且 gitea 用户对仓库目录有读写权限。

3. 检查仓库钩子(hook)—— 钩子失败常导致静默空响应

# 仓库物理路径(app.ini 的 ROOT 下)
ls -la /var/lib/gitea/data/repositories/**/BigData.git/hooks/
# 逐个执行检查是否有坏钩子
for f in /var/lib/gitea/data/repositories/**/BigData.git/hooks/*; do
  [ -x "$f" ] && echo "== $f ==" && head -5 "$f"
done

Gitea 在 push 时会跑 pre-receive / update 钩子;钩子脚本报错会让
receive-pack 无输出返回。必要时把可疑钩子临时移走再测一次。

4. 检查反向代理(若 3000 前面还有 nginx/caddy)

nginx -T 2>/dev/null | grep -iE "client_max_body_size|proxy_request_buffering|proxy_buffering|gzip"
  • client_max_body_size 建议 ≥ 100m
  • /git-receive-pack 若开了 proxy_buffering off + 压缩,可能吞响应体;
    可临时 proxy_buffering on; 对比验证
  • 确认请求实际直达 Gitea(curl -v http://127.0.0.1:3000/... 与本机请求对比)

5. 磁盘 / 权限 / 配额

df -h && du -sh /var/lib/gitea/data/repositories/**/BigData.git
ls -ld /var/lib/gitea/data/repositories/**/BigData.git

磁盘满或目录不可写会令 receive-pack 静默失败。

6. 复现与验证

服务端管理员可用下面的命令直接复现(空包也应返回 git 协议数据而非 0 字节):

curl -u spark:密码 -X POST \
  -H "Content-Type: application/x-git-receive-pack-request" \
  -H "Accept: application/x-git-receive-pack-result" \
  --data-binary "" \
  "http://127.0.0.1:3000/**/BigData.git/git-receive-pack" \
  -w "\nHTTP %{http_code}, body %{size_download} bytes\n"

正常 Gitea:返回 200 且有协议字节;异常:0 bytes

7. 临时兜底

  • 重启 Gitea:systemctl restart gitea(有时是运行态异常)
  • 若以上都查不出,考虑升级/重装 Gitea(当前 1.25.2)

五、客户端侧临时绕过(不等服务端也能推)

SSH 端口 22 可通,管理员在 Gitea 账号 ** 下添加 SSH 公钥后,客户端可改用:

git remote add origin-ssh git@127.0.0.1:**/BigData.git
git push origin-ssh jdk17-upgrade

SSH 推送走的是 git receive-pack(SSH 通道),不受 HTTP 端点故障影响。

posted @ 2026-08-18 11:49  枫中落叶  阅读(18)  评论(0)    收藏  举报