科技 · 实用指南
Git 报 pack 损坏或 index-pack 失败?先证明哪一层丢了字节
在移动 pack、重新克隆或运行垃圾回收前,先区分本地对象库损坏、传输截断与服务器端 pack 生成失败。

pack 校验失败与 invalid index-pack output 并不指向同一责任方:前者可能是已存对象库损坏,后者可能只是传输截断或远端 pack 生产失败后的最后症状。
不要先删 pack、覆盖唯一工作树或运行 gc。保存首错和对象库,证明边界,从可信来源恢复,再以对象、refs、本地改动和可重复传输完成验收。
保存首错并冻结对象写入
保存完整命令、Git 版本、仓库路径、stderr、退出码、传输方式、脱敏 remote,以及第一条 checksum、CRC、bad offset、early EOF 或 index-pack 报错。暂停自动 gc、repack、prune、fetch、镜像与备份任务。
制作文件系统级副本,并另存未提交工作树和 index 改动。不得在唯一副本上试修复;移动、删除或重建前记录相关 .pack 与 .idx 的名称、大小和哈希。
判断本地、传输还是远端失败
已存 pack 的 checksum 或 CRC 失败指向接收方对象库;clone 中的 early EOF 与 invalid index-pack 也可能来自传输截断、客户端空间不足、代理/SSH 或远端 pack-objects。
比较一个正常客户端、一个全新目标和获批的替代传输。只坏一个旧 clone、一个仓库的所有新 clone、或一个客户端的所有仓库,证据含义不同。
映射准确 pack、index、对象与 refs
在保留副本上运行 git fsck --full 并保存输出;对准确的 idx/pack 对运行 git verify-pack。必要时在副本上用 index-pack 重建 index,但成功不等于所有必要 ref 可达。
区分 pack checksum、index checksum/CRC、某偏移坏对象、缺失被引用对象及无引用 dangling 对象,并记录哪些 refs 与 commits 依赖缺失对象。
从可信来源做最小恢复
若本地 clone 可丢弃且 remote 已独立证明含全部 refs,在新目录重克隆,保留本地改动,并比较准确 commit ID。服务器损坏则用可信备份或另一已验证 clone。
只在授权计划下恢复准确对象或 pack 材料,并保持权限。salvage 和 unpack-objects 只在副本上运行,不能作为删除原证据或对不完整库运行 gc/prune 的理由。
以完整性、refs、工作与重复性收尾
最终运行完整 fsck,并按真实来源核对分支、标签和 commit ID;另行确认未提交改动和关键对象可读取。一个分支能 checkout 不代表全部对象完好。
在新空目录重跑原 clone 或 fetch 并保存日志。只有范围内完整性干净、refs 一致、工作已交代、传输不再截断或生成坏字节才关闭。
