首页/开发/Git 与协作速查/git prune 清理不可达对象
Git 基础与命令88 条

git prune 清理不可达对象

删除没有任何引用可达的对象;先用 git fsck --unreachable 查看清单,用 -n 演练确认范围。

Git 与协作速查开发更新于 2026-10-13

git prune 是什么

删除没有任何引用可达的对象(悬空对象):先 git fsck --unreachable 看清单、git prune -n 演练范围,再真正执行。日常多由 git gc 顺带完成,单独使用多见于磁盘紧张或清理特定残留的场景。

基本信息

用途删除不可达对象,回收磁盘空间
演练git prune -n(只列出将被删除的对象)
保留期默认只清理超过约两周的对象,由 gc.pruneExpire 控制
排查git fsck --unreachable 先列出候选对象
顺序建议reflog 仍持有的对象要先处理 reflog 才会被回收

典型使用场景

  • 磁盘紧张:仓库对象占用异常时回收悬空对象释放空间。
  • 清理残留:rebase 或 amend 之后的对象在保留期后被回收。
  • 隐患排查:先用 fsck 看悬空与损坏对象清单,再决定动作。
  • 维护流程:服务器端定期维护的一部分,通常由 gc 顺带触发。
  • 恢复窗口评估:确认误删保护期需求后再调整保留时间。
  • 批量维护窗口:把 fsck 演练与正式清理分两次执行,中间留出复核时间。

常用示例

常用示例
git fsck --unreachable      # 列出不可达对象(悬空提交/树/内容对象)
git prune -n                # 演练:只显示将被删除的对象
git prune                   # 实际删除(默认只动超过保留期的对象)
git prune --expire=now      # 立即回收受保护对象(谨慎使用)
git config gc.pruneExpire   # 查看当前保留期设置

命令与风险对照

命令作用风险
git fsck --unreachable列出不可达对象只读,安全
git prune -n演练将删除的清单安全,仅显示不删除
git prune实际回收过期对象默认保留期内的不动
git prune --expire=now立即回收受保护对象失去恢复窗口,慎用
正常由 gc 代管 prune;单独执行多见于磁盘紧张时,务必先加 -n 演练。reflog 里仍能找回的对象在保留期内不会被删,调整保留期前想清楚误操作恢复窗口的需求,清理后可用 fsck 复查连通性。

易错点

  • reflog 仍持有的对象受保留期保护,直接 prune 删不掉:要先处理 reflog(过期或删除条目),否则白忙一场。
  • 把保留期调得太短会失去误操作恢复窗口:rebase 误弃的提交或分支可能再也找不回,调整前先书面确认恢复需求。
  • prune 不修复损坏对象:fsck 报错要先分析原因(磁盘故障、传输中断)再清理,否则问题会复发。
  • 多工作树、多引用的仓库判定可达性更复杂,清理前在副本上演练确认删除范围。

数据来源与参考

  • Git 官方文档:git-prune
  • Git 官方文档:git-gc(gc.pruneExpire)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌