Skip to content

Git 推送时 unexpected disconnect while reading sideband packet 错误解决指南

问题描述

在使用 Git 进行推送操作时,可能会遇到如下错误:

Enumerating objects: 27, done.
Counting objects: 100% (27/27), done.
Delta compression using up to 16 threads
Compressing objects: 100% (24/24), done.
Writing objects: 100% (25/25), 187.79 KiB | 9.39 MiB/s, done.
Total 25 (delta 1), reused 0 (delta 0), pack-reused 0
send-pack: unexpected disconnect while reading sideband packet
fatal: the remote end hung up unexpectedly

这个错误表明在与远程 Git 服务器通信过程中出现了意外的连接中断,常见于推送大型仓库或网络不稳定的情况下。

常见原因分析

INFO

此错误通常由以下一个或多个因素引起:

  • 网络连接不稳定或速度过慢
  • 网络设备(VPN、防火墙、代理)干扰
  • Git 缓冲区大小不足以处理大量数据
  • Git 客户端版本存在已知问题
  • 仓库中包含过大的文件

解决方案

1. 基础网络检查

首先进行基础网络诊断:

bash
# 测试到 GitHub 的网络连接
ping github.com

# 检查网络稳定性
traceroute github.com

# 重启网络设备(路由器/调制解调器)

WARNING

如果使用 VPN,请尝试暂时禁用 VPN 后重试,因为 VPN 的动态 IP 切换可能导致连接中断。

2. 调整 Git 配置

增加 Git 的缓冲区大小和内存限制:

bash
# 设置更大的 POST 缓冲区
git config --global http.postBuffer 524288000

# 禁用压缩(可减少内存使用)
git config --global core.compression 0

# 设置 Git 包窗口大小(禁用增量压缩)
git config --global pack.window 1

在仓库的 .git/config 文件中添加以下配置以提高内存限制:

ini
[core] 
    packedGitLimit = 512m 
    packedGitWindowSize = 512m 
[pack] 
    deltaCacheSize = 2047m 
    packSizeLimit = 2047m 
    windowMemory = 2047m

3. 使用 SSH 替代 HTTPS

SSH 协议通常比 HTTPS 更稳定:

bash
# 生成 SSH 密钥(如果尚未生成)
ssh-keygen -t ed25519 -C "your_email@example.com"

# 将 SSH 密钥添加到 GitHub 账户后,更改远程 URL
git remote set-url origin git@github.com:username/repo.git

或者全局配置 Git 使用 SSH:

bash
git config --global url."git@github.com:".insteadOf "https://github.com/"

4. 启用详细日志记录

诊断问题时启用详细输出:

bash
export GIT_TRACE_PACKET=1
export GIT_TRACE=1
export GIT_CURL_VERBOSE=1
powershell
$env:GIT_TRACE_PACKET=1
$env:GIT_TRACE=1
$env:GIT_CURL_VERBOSE=1
cmd
set GIT_TRACE_PACKET=1
set GIT_TRACE=1
set GIT_CURL_VERBOSE=1

5. 分步克隆大型仓库

对于大型仓库,使用分步克隆方法:

bash
# 浅层克隆
git clone --depth 1 https://github.com/username/repo.git

# 进入目录
cd repo

# 获取完整历史
git fetch --unshallow
# 或
git fetch --depth=2147483647

6. 优化 SSH 配置

~/.ssh/config 中添加以下配置提升 SSH 性能:

ssh-config
Host *
  HostKeyAlgorithms ecdsa-sha2-nistp256,ssh-rsa
  ControlMaster auto
  ControlPath ~/.ssh/control:%h:%p:%r
  ControlPersist yes
  ServerAliveInterval 60
  Ciphers aes128-gcm@openssh.com

7. 检查并移除大文件

如果仓库历史中包含过大文件:

bash
# 查找大文件
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 10

# 使用 BFG 或 git filter-branch 清理历史中的大文件

8. 更新 Git 和 SSH 客户端

确保使用最新版本的 Git 和 SSH:

bash
# Ubuntu/Debian
sudo apt update && sudo apt upgrade git

# macOS
brew upgrade git

# Windows: 下载最新版 Git for Windows
bash
# Windows: 更新内置 OpenSSH
# 从 https://github.com/PowerShell/Win32-OpenSSH/releases 下载最新版

9. 使用 Git 图形界面客户端

如果命令行方式持续失败,可尝试使用图形界面客户端:

  • GitHub Desktop
  • GitKraken
  • SourceTree

特殊情况处理

Windows 系统特定问题

对于 Windows 用户,特别是使用 Windows 11 on ARM 的用户:

  1. 安装 ARM 版本的 Git for Windows
  2. 使用最新版 OpenSSH(9.2.2.0p1-Beta 或更高版本)
  3. 考虑使用 plink.exe 替代默认 SSH:
    cmd
    set GIT_SSH=C:\path\to\PLINK.EXE

企业环境问题

在企业网络环境中:

  1. 检查防火墙和代理设置
  2. 与网络管理员确认是否有限制
  3. 尝试使用不同的网络(如手机热点)

预防措施

  1. 定期维护本地仓库

    bash
    git gc --prune=now --aggressive
    git repack -a -d -l
  2. 使用浅克隆减少初始下载量

  3. 分割大型仓库为多个较小仓库

  4. 使用 Git LFS管理大文件

总结

unexpected disconnect while reading sideband packet 错误通常与网络问题或 Git 配置相关。通过系统性地检查网络连接、调整 Git 配置、使用 SSH 协议和保持软件更新,大多数情况下可以解决此问题。

TIP

如果所有方法都失败,可以考虑使用 GitHub Desktop 或其他图形界面客户端,它们通常能更好地处理网络不稳定的情况。

如果问题仍然存在,建议检查 GitHub 状态页面(https://www.githubstatus.com/)确认是否服务端存在问题。