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默认为 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,应该就会看到一个输出指明它已执行的工作。