Skip to content

解决 Git 推送错误 "RPC failed; HTTP 400 curl 22"

问题描述

当尝试向 GitHub 私有仓库推送代码(使用 git push origin master)时,出现以下错误:

bash
RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
send-pack: unexpected disconnect while reading sideband packet

此错误通常发生在推送大型文件或大量变更时,Git 的默认 HTTP 缓冲区大小不足,导致服务器中断连接。用户无法在 GitHub 仓库中查看已推送的文件和目录。

解决方案概述

核心解决方法围绕以下三点:

  1. 增大 HTTP 缓冲区(最常用且高效的解决方案)
  2. 确保使用最新 Git 版本
  3. 优化推送内容(分批提交或管理大文件)

以下是详细解决方案:


🔧 方法一:增大 Git HTTP 缓冲区(推荐)

原理

Git 默认的 HTTP 传输缓冲区(~1MB)可能被大型推送操作耗尽。增加 http.postBuffer 让 Git 发送更大的数据包,避免服务器断开连接:

执行以下命令将缓冲区提升到 500MB

bash
git config --global http.postBuffer 524288000
缓冲区值容量说明
524288000500 MB
157286400150 MB

📌 适用场景

  • 推送包含大文件(如图片、二进制文件)
  • 单次提交大量文件变更
  • 仓库历史记录较大

注意

如果使用 HTTPS 认证,请先检查 GitHub 令牌是否有效,过期令牌也会导致 400 错误。


🔄 方法二:更新 Git 版本

较旧的 Git 版本可能存在传输协议缺陷:

  1. 检查当前 Git 版本:

    bash
    git --version
  2. 升级 Git

    bash
    # macOS (Homebrew)
    brew update && brew upgrade git
    
    # Windows
    https://git-scm.com/download/win
    
    # Linux (Ubuntu/Debian)
    sudo apt update && sudo apt install --upgrade git
  3. 确保终端使用正确路径:

    bash
    which git  # 验证是否指向新版路径

📦 方法三:优化推送内容

分批提交

对大型提交进行拆分:

bash
# 分成多个小规模推送
git push origin master:feature-part1
git push origin master:feature-part2

精简推送数据

使用 --thin 参数优化传输:

bash
git push --thin origin master

清理仓库

移除冗余文件并管理大文件:

bash
# 清理无效对象
git gc --aggressive

# 安装 Git LFS 管理大文件
git lfs install
git lfs track "*.psd"  # 追踪大文件类型
git add .gitattributes

⚠️ 注意事项

  1. 服务器限制:

    • GitHub 对单文件限制为 100MB(免费账户)、5GB(LFS)
    • 每次推送的总量建议不超过 2GB
  2. 如果上述方法无效:

    bash
    # 调试模式查看详细错误
    GIT_CURL_VERBOSE=1 git push origin master
  3. 联系 GitHub 支持,提供:

    • 错误日志
    • 仓库大小信息(git count-objects -vH
    • 网络环境说明

总结

问题原因解决方案优先级
HTTP 缓冲区溢出增大 http.postBuffer★★★
Git 版本过旧升级到最新稳定版★★☆
单次推送体积过大分批提交 / 使用 --thin★★☆
仓库包含未优化的大文件启用 git lfs + git gc★★☆

通过逐步应用以上方案,可稳定解决 HTTP 400 curl 22 错误,确保大型推送成功完成。建议优先实施方法一并配合方法三,从源头优化仓库内容结构,可预防未来再次出现类似问题。