git gc
git gc
命令是一个存储库维护命令,"gc" 代表垃圾回收。执行 git gc
实际上是让 Git 清理它在当前存储库中造成的混乱。垃圾回收是一个源自解释型编程语言的概念,这些语言会进行动态内存分配。解释型语言中的垃圾回收用于恢复正在执行的程序无法访问的内存。
Git 存储库会积累各种类型的垃圾。有一类 Git 垃圾是孤立提交或不可访问的提交。执行 git resets 或 git rebase 等修改历史记录的命令时,Git 提交可能会变得不可访问。为了保留历史记录和避免数据丢失,Git 不会删除分离的提交。分离的提交仍然可以通过 git log
签出、精心挑选和检查。
除了清理游离的提交外,git gc
还将对存储的 Git 对象执行压缩,从而释放宝贵的磁盘空间。当 Git 识别出一组相似的对象时,它会将它们压缩成一个‘包’。包就像 Git 对象的 zip 文件一样,存在于存储库的 ./git/objects/pack
目录中。
git gc 实际上做了什么?
执行之前,git gc
首先检查多个 git config 值。这些值将有助于澄清 git gc
的其余责任。
git gc 配置
gc.reflogExpire
默认为 90 天的可选变量,它用于设置分支引用日志中的记录应保留多长时间。
gc.reflogExpireUnreachable
默认为 30 天的可选变量,它用于设置应将不可访问的引用日志记录保留多长时间。
gc.aggressiveWindow
相关资料
如何移动完整的 Git 存储库
查看解决方案
了解 Bitbucket Cloud 的 Git
默认为 250 的可选变量,它控制使用 --agtressive
选项执行 git gc
时,在对象打包的增量压缩阶段花费多少时间。
gc.aggressiveDepth
默认为 50 的可选变量,它控制 git gc --aggresive
执行期间 git-repack
使用的压缩深度
gc.pruneExpire
默认为 "2 weeks ago" 的可选变量,它设置了在修剪之前将无法访问的对象保留多长时间
gc.worktreePruneExpire
默认为 "3 months ago" 的可选变量,它设置了过时的工作树在被删除之前将保留多长时间。
git gc 执行
在幕后,git gc
实际上执行了一系列其他内部子命令,例如 git prune、git repack
、git pack
和 git rerere
。这些命令的高级职责是识别 git gc
配置中设置的阈值级别之外的任何 Git 对象。识别出来之后,这些对象就会被压缩或相应地修剪。
git gc 最佳实践和常见问题解答
垃圾回收会在几个常用的命令上自动运行:
手动执行 git gc
的频率对应于存储库的活动级别。与经常更新的多用户存储库相比,只有一位贡献开发人员的存储库执行 git gc
的频率要低得多。
git gc 与 git prune
git gc
是一个父命令,git prune
是一个子命令。git gc
将在内部触发 git prune
。git prune
用于移除 git gc
配置认为无法访问的 Git 对象。了解有关 git prune 的更多信息。
git gc aggressive 是什么?
git gc
可以使用 --agtressive
命令行选项调用。--aggressive
选项会导致 git gc
在优化工作上花费更多时间。这会导致 git gc
运行速度变慢,但在完成后会节省更多磁盘空间。--aggressive
的效果是持久的,只有在对存储库进行大量变更后才需要运行。
什么是 git gc auto?
git gc --auto
命令变体在执行之前首先检查代码存储库中是否需要进行任何内务管理。如果它发现不需要内务管理,它会在不做任何工作的情况下退出。有些 Git 命令在执行后会隐式运行 git gc --auto
来清理它们创建的所有松散对象。
执行之前,git gc --auto
将检查 git
配置中松散对象的阈值和打包压缩大小。这些值可以使用 git config 进行设置。如果存储库超过任何内务操作阈值,将会执行 git gc --auto
。
git gc 入门
您可能已经在没有注意到的情况下使用了 git gc
。正如最佳实践部分所述,它是通过常用命令自动调用的。如果您想手动调用,只需执行 git gc
,应该就会看到一个输出指明它已执行的工作。
分享此文章
下一主题
推荐阅读
将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。