修复GitHub仓库文件损坏问题:inflate returned -3
问题
推送包含PDF/DjVu文件的GitHub仓库时,反复出现如下错误:
Enumerating objects: 153, done. Counting objects: 100% (153/153), done. Delta compression using up to 8 threads Compressing objects: 100% (152/152), done. remote: error: inflate: data stream error (incorrect data check) remote: fatal: pack has bad object at offset 909244: inflate returned -3 error: remote unpack failed: index-pack abnormal exit To github.com:A-GitHub-Organisation/Algebraic-Geometry.git ! \[remote rejected\] main -> main (failed) error: failed to push some refs to 'github.com:A-GitHub-Organisation/Algebraic-Geometry.git'
推测问题源于仓库在NAS存储一年多后,文件(非仅.git文件夹)出现轻微损坏,尽管文件仍可在evince、zathura等阅读器正常打开。
已尝试的无效方案
- 新建仓库并迁移所有文件
- 执行
git gc、git gc --aggressive、git-repair、git fsck --full命令
当前可行但繁琐的方法
先执行git add .;git commit -m "something"提交文件,再运行watch -d -n 2 'git push'反复尝试推送,经过1-10+次尝试后推送可成功,且所需尝试次数与提交大小成正比。
原因分析
这个错误的核心是远程Git服务器解压推送的pack文件时校验失败:
- 本地仓库的Git对象或待推送的二进制文件(PDF/DjVu)存在隐性损坏——阅读器具备容错机制,能忽略微小的二进制流错误,但Git对对象的CRC校验极其严格,这类隐性损坏会导致远程解压时校验不通过。
- NAS长期存储可能出现磁盘扇区轻微损坏、文件系统静默数据错误或缓存一致性问题,进而引发文件的隐性损坏。
修复方案
1. 重新生成本地Git对象
- 先备份当前仓库(避免操作失误)
- 清空本地缓存并重新追踪所有文件,让Git重新计算文件哈希、生成全新对象:
git rm -r --cached . git add . git commit -m "Rebuild all file objects"
2. 强制清理并重新打包本地对象
- 删除
.git/objects/pack/目录下所有.pack和.idx文件 - 执行重新打包命令,生成无损坏的pack文件:
git repack -a -d -f
3. 修复二进制文件本身的隐性损坏
针对PDF/DjVu文件重新生成,去除潜在的二进制错误:
- PDF:使用
pdftk input.pdf output fixed.pdf重新生成(需安装pdftk工具),替换原文件后提交 - DjVu:使用
djvudigital input.djvu fixed.djvu重新编码,替换原文件后提交
4. 临时禁用Delta压缩推送
如果上述方法无效,可关闭Git的Delta压缩,避免压缩损坏文件导致校验失败:
git config --global core.compression 0 git push
推送完成后可恢复默认压缩值:git config --global core.compression 6
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

