土法炼钢兴趣小组的算法知识备份

【Git 内部】fsck:校验规则与损坏形态

文章导航

分类入口
opensource
标签入口
#git#git-internals#fsck#corrupt#dangling

目录

对象库损坏并不罕见:磁盘错误、不完整复制、手工改 .git/objects、云同步工具冲突。git fsck 遍历对象与引用,报告 corruptdanglingmissing 等类型。分清「真损坏」与「悬空未引用」,决定能否从备份或 reflog 恢复。


一、fsck 查什么

git fsck(全称 filesystem check)主要验证:

git fsck 分类:corrupt、missing、dangling 的判定路径

不加参数时报告悬空对象(dangling)为 informational;--full 更彻底。


二、corrupt loose object 实测

对含松散对象的仓库,取一对象文件,先 chmod u+w(松散对象默认只读),截断最后一字节:

OBJ=.git/objects/83/096816d05d4fe8d052a9726dc217daed3d2091
chmod u+w "$OBJ"
truncate -s -1 "$OBJ"
git fsck

输出(Git 2.54.0):

error: corrupt loose object '83096816d05d4fe8d052a9726dc217daed3d2091'
fatal: loose object 83096816d05d4fe8d052a9726dc217daed3d2091 (stored in .git/objects/83/096816…) is corrupt

说明 zlib 或长度校验失败。修复:从备份还原该对象文件,或 git fetch 从远端重新拉取缺失对象。


三、常见报告类型

类型 含义 典型处理
corrupt loose object 文件内容坏 还原对象或 re-fetch
bad sha1 file ref 文件非合法 SHA 手工或从备份修 ref
dangling commit/blob/tree 无 ref 可达但仍存在 通常可忽略;或 git gc prune
missing blob/tree/commit 引用指向不存在的对象 严重;需从远端/备份补对象
error in pack pack 校验失败 删除坏 pack 并 re-fetch

四、dangling 与丢失的区别

dangling:对象完好,只是没有分支/tag 指向(例如 amend 后的旧 commit)。git fsck 列出 SHA;可用 git show <sha> 查看,或通过 reflog 找回。

missing:应有对象却不在库中——例如 partial clone 失败、手动删了 objects/ 子目录。必须重新获取。


五、lost-found

git fsck --lost-found 把悬空 commit/tree/blob 挂到 refs/bisect/.git/lost-found/ 下,便于人工检查。不是自动恢复分支。


六、pack 损坏

pack 尾部 SHA 覆盖整个 pack;单比特损坏可能导致整个 pack 不可用。处理:删除该 pack 与 idx,从 remote 重新 fetch(或 restore 备份)。git verify-pack -v 可提前扫描。


七、本文边界


参考资料

系列索引Git 内部结构 · 上篇gc/repack · 下篇porcelain 文件副作用

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-07-05 · opensource

【Git 内部】Git 内部结构:对象库与磁盘文件格式

从 .git 目录布局、松散对象与 packfile 格式,到 refs、index、reflog、gc/fsck 与 fetch/push 落地——用官方 format 文档与本地实测 dump 系统讲清 Git 把版本历史存在哪、每个命令改写了哪些文件。全 16 篇。


By .