Git push到GitHub报错curl 92 (err 8) 常规方案无效(隐藏大文件问题)
问题根因
error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: CANCEL (err 8)在GitHub推送场景下,排除公网网络、代理问题后,核心原因是暂存区或待推送的提交历史中存在超过GitHub单文件100MB硬限制的文件,服务端检测到违规内容后主动断开HTTP流,触发该报错。
你当前工作区可见的最大文件仅35MB,不代表提交内容合规:大概率是之前误提交了临时生成的大文件(比如Rstudio生成的.Rproj.user缓存、.RData工作空间备份、临时导出数据集、日志文件等),后续即使在工作区删除了该文件,它仍然存在于待推送的commit历史中,会被一并推送到服务端。
排查步骤
先定位违规大文件,无需直接重建分支丢失提交历史:
- 第一步:排查暂存区大文件
执行以下命令列出暂存区所有文件,按大小倒序排列取前20个:
如果输出中存在超过100MB的文件,直接从暂存区移除,并加入忽略列表:git ls-files -s | awk '{print $4}' | xargs ls -lh 2>/dev/null | sort -k5 -hr | head -20git rm --cached <查到的大文件完整路径> echo "<大文件完整路径>" >> .gitignore - 第二步:排查待推送提交历史中的大文件
如果暂存区未找到违规文件,说明大文件藏在之前的提交记录里,执行以下命令扫描本地比远端多出的所有提交中的大文件:
输出第二列为文件大小(单位字节),超过104857600字节(即100MB)的文件就是触发报错的原因。git fetch origin git rev-list --objects origin/HEAD..HEAD | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {print substr($0,6)}' | sort -k2 -nr | head -20
修复方案
根据大文件所在位置选择对应操作,所有操作都不会丢失正常的提交历史:
- 场景1:大文件存在于最近一次未推送的commit中
直接将大文件从commit中移除即可:
操作完成后直接执行git rm --cached <大文件完整路径> echo "<大文件完整路径>" >> .gitignore git add .gitignore git commit --amend --no-editgit push即可正常推送。 - 场景2:大文件存在于多个待推送的历史commit中
使用git filter-repo清理全量历史中的违规文件(不要使用已废弃的git filter-branch,性能差易出错):- 先通过系统包管理器安装
git-filter-repo(macOS执行brew install git-filter-repo,Debian/Ubuntu执行apt install git-filter-repo即可) - 执行命令将大文件从所有提交历史中移除:
git filter-repo --invert-paths --path <大文件完整路径> - 将大文件路径加入
.gitignore后重新关联远端仓库(filter-repo操作会自动移除远端关联):echo "<大文件完整路径>" >> .gitignore git add .gitignore git commit -m "chore: ignore large temp file" git remote add origin <你的仓库SSH/HTTPS地址> - 执行推送即可,原有正常提交记录会完整保留。
- 先通过系统包管理器安装
此前方案无效原因说明
- 调大
http.postBuffer仅对HTTP请求体缓冲区不足导致的传输失败有效,本问题是服务端主动断连,调大缓冲区只会延长无效等待时间,无法解决核心问题。 - 降级HTTP/1.1仅更换了传输协议,没有移除提交内容中的违规大文件,自然会触发新的报错。
- 不建议采用删除原主分支、重建新分支设为默认的方案,该方案会丢失分支上的提交历史,完全没有必要。
内容的提问来源于stack exchange,提问作者Aaarrrgh's My Game
相关产品推荐
相关产品推荐

