Git
简体中文 ▾ Topics ▾ Latest version ▾ git-gc last updated in 2.44.0

名称

git-gc - 清理不必要的文件并优化本地仓库

概述

git gc [--aggressive] [--auto] [--quiet] [--prune=<日期> | --no-prune] [--force] [--keep-largest-pack]

描述

在当前版本库中执行一些内务管理任务,比如压缩文件修订(以减少磁盘空间并提高性能),移除之前调用 git add 所创建的不可达对象,打包引用,修剪引用日志、rerere metadata 或过时的工作区。也可以更新辅助索引,如提交图。

当运行创建对象的普通上层命令操作时,它们会检查仓库在上次维护后是否有大幅增长,如果有,就自动运行 git gc。参见下面的 gc.auto 以了解如何禁用这一行为。

手动运行 git gc 应该只在向仓库添加对象而不定期运行这种上层命令时才需要,以进行一次性的仓库优化,或者例如清理次优的大规模导入。关于导入情况的更多细节,请参见 git-fast-import[1] 中的 “包装文件优化” 部分。

选项

--aggressive

Usually git gc runs very quickly while providing good disk space utilization and performance. This option will cause git gc to more aggressively optimize the repository at the expense of taking much more time. The effects of this optimization are mostly persistent. See the "AGGRESSIVE" section below for details.

--auto

有了这个选项,git gc 就会检查是否需要任何内务处理;如果不需要,它就会退出,不执行任何工作。

关于这个启发式的工作原理,请看下面 “配置” 部分的 gc.auto 选项。

一旦超过配置选项如 gc.autogc.autoPackLimit 的限制而触发内务管理,所有其他内务管理任务(如 reere、working trees、reflog…​)也将被执行。

--[no-]cruft

当无法到达的对象过期时,将它们单独打包到一个 cruft 包中,而不是将它们作为散装对象存储。--cruft 是默认开启的。

--max-cruft-size=<n>

在将无法访问的对象打包到 Cruft 包时,限制新 Cruft 包的大小最多为 <n> 字节。覆盖通过 gc.maxCruftSize 配置指定的任何值。参见 git-repack[1] 的 `--max-cruft-size`选项了解更多。

--prune=<日期>

Prune loose objects older than date (default is 2 weeks ago, overridable by the config variable gc.pruneExpire). --prune=now prunes loose objects regardless of their age and increases the risk of corruption if another process is writing to the repository concurrently; see "NOTES" below. --prune is on by default.

--no-prune

不要修剪任何松散的对象。

--quiet

抑制所有进度报告。

--force

强制 git gc 运行,即使这个仓库可能有另一个 git gc 实例在运行。

--keep-largest-pack

除了最大的非破坏性包,任何标有 .keep 文件的包,以及任何破坏性的包,都会被合并为一个包。当使用这个选项时,gc.bigPackThreshold 被忽略。

侵略的

当提供 --aggressive 选项时,git-repack[1] 将被调用,并带有 -f 标志,这又将把 --no-reuse-delta 传递给 git-pack-objects[1]。这将丢弃任何现有的 delta 并重新计算,代价是在重新打包上花费更多的时间。

这方面的影响主要是持久性的,例如,当包和松散对象被凝聚成另一个包时,该包中现有的 delta 可能会被重新使用,但也有各种情况,我们可能会从一个较新的包中挑选一个次优 delta。

此外,提供 --aggressive 将调整传递给 git-repack[1]--depth--window 选项。见下面的 gc.aggressiveDepthgc.aggressiveWindow 设置。通过使用较大的窗口尺寸,我们更有可能找到更多的最佳 deltas。

在没有运行定制的性能基准的情况下,在一个给定的仓库上使用这个选项可能是不值得的。它需要更多的时间,而由此产生的空间/延迟优化可能值得也可能不值得。对于大多数用户和他们的仓库来说,完全不使用这个选项是正确的权衡。

配置

Warning

Missing zh_HANS-CN/includes/cmd-config-section-all.txt

See original version for this content.

Warning

Missing zh_HANS-CN/config/gc.txt

See original version for this content.

注释

git gc 非常努力地不删除在你的仓库中任何地方被引用的对象。特别是,它不仅会保留当前分支和标记集所引用的对象,还会保留索引、远程跟踪分支、 引用日志(可能引用了后来被修改或回绕的分支中的提交)以及 refs/* 名称空间中的任何其他对象。请注意,附在一个对象上的注释(由 git notes 创建的那种)并不有助于保持该对象的活力。如果你期待一些对象被删除,而它们没有被删除,请检查所有这些位置,并决定在你的情况下,删除这些引用是否有意义。

另一方面,当 git gc 与另一个进程同时运行时,它有可能删除另一个进程正在使用但还没有创建引用的对象。这可能会导致其他进程失败,或者如果其他进程后来添加了对被删除对象的引用,则可能会破坏仓库。Git 有两个功能可以大大缓解这个问题:

  1. 任何修改时间早于 --prune 日期的对象都会被保留,同时也会保留所有可以到达的对象。

  2. 大多数向数据库添加对象的操作都会更新对象的修改时间,如果它已经存在,那么 #1 就适用。

然而,这些功能并不是一个完整的解决方案,所以同时运行命令的用户不得不忍受一些损坏的风险(在实践中似乎很低)。

钩子

The git gc --auto command will run the pre-auto-gc hook. See githooks[5] for more information.

GIT

属于 git[1] 文档

scroll-to-top