git gc 是什么
git gc 负责整理仓库:把大量松散对象打包压缩、整理引用、清理临时文件与过期对象,让 log、diff 这类操作更快。日常提交与合并会按阈值自动触发一次 --auto,因此多数情况下无需手动调用。手动执行通常用在长期未整理、仓库明显变慢,或刚刚删掉大量历史对象之后。它是维护动作而非数据操作,但其中的 --prune 相关选项会影响不可达对象,需要留意。
基本信息
| 默认动作 | 对象打包、引用整理、临时文件清理 |
|---|---|
| 自动触发 | git gc --auto,由 commit/merge 等命令按阈值调用 |
| 谨慎选项 | --prune=now 立即清理不可达对象 |
| 查看现状 | git count-objects -v 看松散对象数量 |
| 平台 | 任意 Git 客户端 |
典型使用场景
- 仓库长期未整理,log 与 diff 响应明显变慢
- 刚删掉大量文件或分支,想回收空间
- 把远端仓库从旧平台迁移到自建服务后整理一次
- 排查仓库体积异常,先定位成因再决定是否整理
- 发布冻结期给大仓做一次维护,缩短后续操作耗时
- 误删对象后确认不可达内容是否仍在,避免过早清理
常用示例
常用示例
git count-objects -v # 查看松散对象与体积
git gc # 常规整理
git gc --auto # 按阈值判断是否需要整理
git repack -ad # 重新打包全部对象
git gc --prune=now # 立即清理不可达对象(谨慎)相关命令分工
| 命令 | 作用 |
|---|---|
| git gc | 常规整理,合并打包与清理 |
| git repack | 只负责重新打包对象 |
| git prune | 只清理不可达对象 |
仓库出现大量松散文件时(count-objects 可见),一次 gc 往往能明显改善 log 与 diff 的响应速度。
--prune=now 会立即清理不可达对象,越过 reflog 的后悔窗口后内容将无法找回;刚做过高风险操作时先别急。
判断是否需要整理的依据
- git count-objects -v 看松散对象数量是否明显偏大
- log 与 diff 操作明显变慢,且仓库长期未整理
- 刚删除大量分支或文件,需要回收空间
- 迁移或备份前后做一次,保证两侧状态干净