如何解决git p4迁移Perforce仓库到GitHub的推送连接中断报错
问题根因确认
你遇到的推送报错和本地7.79GiB的.git目录体积直接强相关,本质上是单次推送的全量包体积过大,导致Windows系统下的TCP长连接在大流量传输过程中被本地网络栈、中间网关强制中断,对应日志里的curl 56 errno 10053就是Windows系统主动终止连接的典型报错。
之前调整http.postBuffer、降级HTTP/1.1没有效果的原因是:这两个配置只能解决本地临时写入缓冲不足的问题,既绕不开GitHub对单次RPC推送的体积限制,也没法解决长连接传输时间过长被中断的问题。
可落地的修复方案
方案1:分段推送全量历史(无需清理仓库,最快解决)
把原本要一次性推完的7.78GiB全量提交,拆成多个小体积的分批次推送,每次传输的包体积控制在1GiB以内,就能避开长连接超时中断的问题:
- 先按时间从早到晚列出所有提交节点,找到适合拆分的历史锚点:
git log --oneline --reverse --pretty=format:"%h %ad" --date=short - 从最早的提交开始,逐个区间往GitHub推送:比如最早的根提交哈希是
a1b2c3d,第一个拆分锚点的提交哈希是e4f5g6h,执行命令推送第一个区间的历史:git push origin a1b2c3d:refs/heads/main e4f5g6h:refs/heads/main - 等第一个区间推送完成后,再依次取下一个拆分锚点,重复执行推送命令,直到把全部提交历史都同步到远端main分支即可。这种方式每次传输的数据量很小,传输耗时短,不会触发连接中断。
- 配套Windows网络优化,进一步降低中断概率:
- 临时关闭Git的对象压缩逻辑,减少本地压缩耗时:
git config core.compression 0 - 拉满低速超时阈值,避免Git因为瞬时网速波动主动断连:
git config http.lowSpeedLimit 0 git config http.lowSpeedTime 999999
- 临时关闭Git的对象压缩逻辑,减少本地压缩耗时:
方案2:清理git p4导入带来的冗余历史文件(从根源缩小仓库体积)
绝大多数从Perforce全量导入的Git仓库,.git目录体积虚高都是因为保留了大量历史上已经删除的构建产物、二进制安装包、临时大文件,这些内容根本不需要同步到GitHub上:
- 先扫描全历史中超过100MiB的大文件,标记出不需要保留的冗余内容:
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {print substr($0,6)}' | sort --numeric-sort --key=2 | tail -n 20 - 将这些冗余大文件从全量提交历史中清理后,通常整体仓库体积能压缩到原大小的1/10以内,之后一次性全量推送就能顺利完成,不会再出现连接中断的问题。
操作注意:分段推送过程中如果出现单区间推送失败,直接重新执行对应区间的推送命令即可,Git会自动跳过已经传输完成的对象,不会重复上传。
内容的提问来源于stack exchange,提问作者IkutaLanToma
相关产品推荐
相关产品推荐

