解决 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 仓库中查看已推送的文件和目录。
解决方案概述
核心解决方法围绕以下三点:
- 增大 HTTP 缓冲区(最常用且高效的解决方案)
- 确保使用最新 Git 版本
- 优化推送内容(分批提交或管理大文件)
以下是详细解决方案:
🔧 方法一:增大 Git HTTP 缓冲区(推荐)
原理
Git 默认的 HTTP 传输缓冲区(~1MB)可能被大型推送操作耗尽。增加 http.postBuffer
让 Git 发送更大的数据包,避免服务器断开连接:
执行以下命令将缓冲区提升到 500MB:
bash
git config --global http.postBuffer 524288000
缓冲区值 | 容量说明 |
---|---|
524288000 | 500 MB |
157286400 | 150 MB |
📌 适用场景:
- 推送包含大文件(如图片、二进制文件)
- 单次提交大量文件变更
- 仓库历史记录较大
注意
如果使用 HTTPS 认证,请先检查 GitHub 令牌是否有效,过期令牌也会导致 400 错误。
🔄 方法二:更新 Git 版本
较旧的 Git 版本可能存在传输协议缺陷:
检查当前 Git 版本:
bashgit --version
升级 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
确保终端使用正确路径:
bashwhich 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
⚠️ 注意事项
服务器限制:
- GitHub 对单文件限制为 100MB(免费账户)、5GB(LFS)
- 每次推送的总量建议不超过 2GB
如果上述方法无效:
bash# 调试模式查看详细错误 GIT_CURL_VERBOSE=1 git push origin master
联系 GitHub 支持,提供:
- 错误日志
- 仓库大小信息(
git count-objects -vH
) - 网络环境说明
总结
问题原因 | 解决方案 | 优先级 |
---|---|---|
HTTP 缓冲区溢出 | 增大 http.postBuffer | ★★★ |
Git 版本过旧 | 升级到最新稳定版 | ★★☆ |
单次推送体积过大 | 分批提交 / 使用 --thin | ★★☆ |
仓库包含未优化的大文件 | 启用 git lfs + git gc | ★★☆ |
通过逐步应用以上方案,可稳定解决 HTTP 400 curl 22
错误,确保大型推送成功完成。建议优先实施方法一并配合方法三,从源头优化仓库内容结构,可预防未来再次出现类似问题。