Git推送失败完整解决方案(含大文件历史清理、协议优化、身份配置)
一、问题概述
核心场景:本地仓库存在多个commit历史,包含./svn文件夹(近9千个文件,总大小8.87GB),推送至GitHub时持续报错,具体问题包括:
推送协议错误:
fatal: protocol error: bad line length 8192/16384、send-pack: unexpected disconnect while reading sideband packetGit LFS兼容问题:
Remote "origin" does not support the Git LFS locking API、网络超时(wsarecv错误)提交者身份缺失:
Author identity unknown,无法创建commit终端命令兼容:PowerShell与Git Bash命令不互通(如Select-String/grep)
核心需求:不删除、不更名本地./svn文件夹,仅通过Git配置和历史清理解决推送问题,确保远程仓库体积正常。
基础信息(已确认):
GitHub账号邮箱:rutongsu@139.com
提交者昵称:SmartRadio
仓库SSH地址:git@github.com:SmartRadio/svn-cari.git
本地仓库路径:D:\work\2025\svn
二、前置准备
2.1 环境确认
选择以下任一终端(推荐Git Bash,避免命令兼容问题):
Git Bash:右键仓库文件夹 →「Git Bash Here」
Windows PowerShell:Win + X → 选择「Windows PowerShell」
2.2 仓库备份(必做)
复制本地仓库文件夹(D:\work\2025\svn)到桌面或其他位置(如svn-cari-backup),避免操作失误丢失./svn文件夹数据。
三、分步解决方案
阶段1:清理历史大文件(核心减体积)
问题根源:历史commit中残留./svn文件夹(8.87GB),导致推送数据量过大触发协议错误。需彻底删除历史中的./svn相关文件,保留本地文件夹。
3.1 方案1:git filter-repo清理(Git官方推荐,无残留)
适用场景:Git版本≥2.22(执行git --version检查,低于则执行git update-git-for-windows更新)
### 1. 进入仓库目录(Git Bash命令)cd/d/work/2025/svn### 2. 卸载冲突工具(若之前使用过git-filter-branch)gitfilter-branch --clean-filtered-files### 3. 双重清理历史中的./svn文件夹(确保无残留)gitfilter-repo --force --path-glob"*/svn/*"--invert-pathsgitfilter-repo --force --path"svn/"--invert-paths### 4. 深度压缩仓库体积(关键步骤)gitreflog expire --expire=now --allgitgc --prune=now --aggressivegitrepack -a -d -f --depth=250--window=2503.2 方案2:BFG Repo-Cleaner清理(简单高效,适合新手)
### 1. 下载BFG工具(放在仓库根目录)# 下载地址:https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar### 2. 进入仓库目录(Git Bash命令)cd/d/work/2025/svn### 3. 执行清理命令java -jar bfg-1.14.0.jar --delete-folders svn.### 4. 压缩仓库体积gitreflog expire --expire=now --allgitgc --prune=now --aggressive3.3 清理验证(Git Bash/PowerShell通用)
### 验证1:历史中无svn相关文件(无输出则成功)# Git Bashgitrev-list --objects --all|grep"svn"# PowerShellgitrev-list --objects --all|Select-String"svn"### 验证2:查看仓库体积(.git文件夹应<100MB)# Git Bashdu-sh .git/# PowerShell(Get-ChildItem -Path .git -Recurse|Measure-Object -Property Length -Sum).Sum / 1GB阶段2:配置提交者身份(解决Author identity unknown)
问题:Git提交需记录身份信息(姓名+邮箱),未配置则无法创建commit。直接使用你的信息配置:
### Git Bash/PowerShell通用命令(全局配置,一次生效)gitconfig --global user.email"rutongsu@139.com"gitconfig --global user.name"SmartRadio"### 验证配置(Git Bash)gitconfig --global --list|grep"user."# 预期输出:# user.name=SmartRadio# user.email=rutongsu@139.com### 验证配置(PowerShell)gitconfig --global --list|Select-String"user."阶段3:配置.gitignore(禁止追踪./svn,避免未来误提交)
### 1. 在仓库根目录创建/编辑.gitignore(Git Bash)touch.gitignore# 或用记事本打开编辑(PowerShell)notepad .gitignore### 2. 添加以下内容到.gitignore(禁止追踪./svn)./svn/ *.svn* .svn/### 3. 提交.gitignore文件(Git Bash/PowerShell通用)cd/d/work/2025/svn# 确保在仓库目录gitadd.gitignoregitcommit -m"Add ./svn and *.svn-base to .gitignore"预期结果:显示[main xxxxxxx] Add ./svn and *.svn-base to .gitignore 1 file changed, x insertions(+),说明提交成功。
阶段4:解决Git LFS兼容问题(报错:LFS locking API不支持)
### 1. 禁用LFS锁定验证(Git Bash/PowerShell通用)cd/d/work/2025/svngitconfig lfs.https://github.com/SmartRadio/svn-cari.git/info/lfs.locksverifyfalse### 2. 清理LFS残留(若未实际使用LFS)# 检查是否有LFS追踪文件gitlfs track# 若有输出,执行以下命令取消追踪gitlfs untrack"*"rm.gitattributes# Git Bash# 或PowerShell:Remove-Item .gitattributes -ErrorAction SilentlyContinue# 提交清理操作gitadd.gitattributesgitcommit -m"remove LFS tracking"# 清理LFS缓存gitlfs prune阶段5:优化传输配置(解决协议错误+网络超时)
核心:切换SSH协议(稳定性远超HTTPS)+ 增大缓冲区(避免bad line length错误)
5.1 切换SSH协议(关键步骤)
### 1. 生成SSH密钥(Git Bash/PowerShell通用)ssh-keygen -t ed25519 -C"rutongsu@139.com"# 按3次回车(默认路径、无密码),生成密钥文件:C:\Users\你的用户名\.ssh\id_ed25519.pub### 2. 复制SSH公钥(Git Bash)catC:\Users\你的用户名\.ssh\id_ed25519.pub# 或PowerShell:Get-Content C:\Users\你的用户名\.ssh\id_ed25519.pub### 3. 添加公钥到GitHub(网页操作)# 1. 登录GitHub → 头像 → Settings → SSH and GPG keys → New SSH key# 2. 标题填「SmartRadio-Windows」,粘贴复制的公钥,点击「Add SSH key」### 4. 修改仓库远程地址为SSH(Git Bash/PowerShell通用)# 删除原有HTTPS地址gitremote remove origin# 添加SSH地址gitremoteaddorigin git@github.com:SmartRadio/svn-cari.git# 验证(预期输出SSH地址)gitremote -v5.2 增大Git缓冲区(HTTPS协议备用,SSH协议可忽略)
### Git Bash/PowerShell通用(全局配置)gitconfig --global http.postBuffer1073741824# 1GB缓冲区gitconfig --global https.postBuffer1073741824gitconfig --global http.timeout300# 延长超时时间(5分钟)gitconfig --global https.timeout3005.3 SSH超时兜底配置(若推送仍超时)
### Git Bash/PowerShell通用gitconfig --global core.sshCommand"ssh -o ConnectTimeout=30 -o StrictHostKeyChecking=no -p 443"# 原理:通过443端口传输SSH数据,绕过防火墙限制阶段6:最终推送至GitHub
### Git Bash/PowerShell通用(强制推送,因清理过历史)cd/d/work/2025/svngitpush --force origin main### 若提示需要用户名密码(GitHub禁用密码认证)# 用户名:输入GitHub账号名(如SmartRadio)# 密码:输入GitHub个人访问令牌(生成步骤:GitHub → Settings → Developer settings → Personal access tokens → 勾选repo权限 → 生成后复制)四、验证推送结果
4.1 远程验证(GitHub网页)
访问仓库地址:https://github.com/SmartRadio/svn-cari.git
查看「Commits」:最新提交记录显示作者为SmartRadio,邮箱为rutongsu@139.com
查看「Files」:根目录存在.gitignore文件,无./svn文件夹
查看仓库体积:页面底部「About」显示体积≤100MB(正常代码体积)
4.2 本地验证
### 验证1:./svn文件夹仍存在(Git Bash)ls-d ./svn# 或PowerShell:Test-Path ./svn(输出True)### 验证2:Git不再追踪./svn(Git Bash/PowerShell通用)gitstatus# 预期:无./svn相关的追踪提示,仅显示“nothing to commit, working tree clean”五、后续预防措施
禁止修改.gitignore中关于./svn的配置,避免误追踪
推送前先执行
git status检查,确保无未追踪的大文件若需新增大文件(>50MB),使用Git LFS追踪(需提前安装:
git lfs install)多人协作时,推送前先拉取(
git pull origin main),避免冲突
六、常见问题兜底方案
6.1 推送提示“Permission denied (publickey)”
原因:SSH密钥未添加到GitHub或密钥路径错误。解决:重新执行「阶段5.1 切换SSH协议」的步骤2-4,确保公钥复制完整。
6.2 清理后仓库体积仍过大
### 查找仓库中最大的10个文件(Git Bash)gitrev-list --objects --all|grep"$(gitverify-pack -v .git/objects/pack/*.idx|sort-k3-n|tail-10|awk'{print $1}')"# 找到大文件后,用filter-repo删除:gitfilter-repo --force --path"大文件路径"--invert-paths6.3 GitHub提示“受保护分支禁止强制推送”
解决:登录GitHub → 仓库 → Settings → Branches → 找到main分支的保护规则 → 临时关闭“Do not allow bypassing the above settings” → 推送完成后重新开启。