裸Git仓库的pack文件是否为必需文件?丢失损坏后能否恢复数据?
Git仓库损坏pack文件及数据恢复方案
损坏pack文件恢复操作
首先不要再对存储原仓库的SD卡做任何写入操作,避免坏块扩散:
- 优先使用
ddrescue工具对SD卡做完整的块级镜像,所有后续操作都基于镜像文件执行,不要直接操作原SD卡 - 从镜像中提取目标仓库的pack文件后,运行
git unpack-objects < 损坏的pack文件路径,所有CRC校验完好的Git对象都会被自动拆解为松散对象存储到objects目录下,损坏的对象会被跳过 - 对裸仓库执行
git fsck --full扫描所有对象,确认可正常读取的对象范围,完全损坏的块对应的对象无法恢复
移除pack目录后的仓库数据提取方案
你当前克隆报错是因为HEAD指向的提交依赖的tree对象存储在已删除的pack文件中,仍可提取剩余完好的对象数据:
- 进入拷贝出来的裸仓库目录,执行
git fsck --lost-found,所有可正常读取、且无分支/标签引用的对象(提交、树、二进制文件blob)都会被自动存储到仓库下的lost-found目录 - 查看
lost-found/commit目录下的文件,文件名即为可用的提交哈希,执行git show <提交哈希>可查看对应提交的提交信息和完整代码内容 - 确认可用提交后,可直接基于提交哈希创建新的可用分支:
git branch 恢复分支名 <提交哈希>,后续克隆该分支即可拿到完好的代码 - 若仅需要单个文件的历史版本,可直接查看
lost-found/blob目录下的二进制文件,执行cat <blob哈希>即可直接输出对应文件的内容,无需依赖完整的提交或树对象
已经彻底损坏的pack文件中存储的对象无法恢复,以上操作只能提取所有未损坏的可用对象。
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

