## 命名

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

## 概要

    git gc [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune] [--force]

## 描述

在当前存储库中运行许多内务处理任务，例如压缩文件修订（以减少磁盘空间并提高性能）并移除可能由之前`git add`调用创建的不可达对象。

鼓励用户在每个存储库中定期运行此任务，以保持良好的磁盘空间利用率和良好的操作性能。

一些git命令可能会自动运行`git gc`; `--auto`详细信息请参阅下面的标志。如果您知道自己在做什么，并且所有您想要的都是永久禁用此行为而无需进一步考虑，请执行以下操作：

    $ git config --global gc.auto 0

## 选项

--aggressive

通常`git gc`运行速度很快，同时提供良好的磁盘空间利用率和性能 此选项将导致`git gc`更积极地优化存储库，但花费更多时间。这种优化的效果是持久的，所以这个选项只需要偶尔使用; 每隔几百个变更集左右。

--auto

使用此选项，`git gc`检查是否需要进行任何清洁工作; 如果没有，它会退出而不执行任何工作。一些git命令`git gc --auto`在执行可能会产生许多松散对象的操作之后运行。

如果存储库中的松散对象太多或包装太多，则需要进行内务处理。如果松散对象的数量超过了`gc.auto`配置变量的值，则所有松散对象都将使用组合到一个包中`git repack -d -l`。将值设置`gc.auto`为0将禁用自动填充松散物体。

如果包装数量超过了价值`gc.autoPackLimit`，那么现有包装（标有`.keep`文件的包装除外）将通过使用`-A`选项合并到一个包装中`git repack`。设置`gc.autoPackLimit`为0将禁用自动合并包装。

--prune=<date>

修剪比日期更旧的松散对象（默认为2周前，可由配置变量覆盖`gc.pruneExpire`）。--prune =不管年龄大小，都修剪松散的物体，并且如果另一个进程同时写入存储库，则会增加腐败风险; 请参阅下面的“注意事项”。--prune默认打开。

--no-prune

不要修剪任何松动的物体。

--quiet

取消所有进度报告。

--force

`git gc`即使可能有另一个`git gc`实例在此存储库上运行，也强制运行。

## 组态

可选配置变量`gc.reflogExpire`可以设置为指示每个分支的reflog中的历史条目应该在此存储库中保持可用的时间。该设置表示为一段时间，例如`90 days`或`3 months`。它默认为`90 days`。

可选配置变量`gc.reflogExpireUnreachable`可设置为指示不属于当前分支的历史请求日志条目在此存储库中保持可用的时间。这些类型的条目通常是由于使用`git commit --amend`或`git rebase`而创建的，并且是在修改或重新发生之前的提交。由于这些更改不是当前项目的一部分，因此大多数用户都希望尽快过期。该选项默认为`30 days`。

上述两个配置变量可以赋予一个模式。例如，这会将非默认到期值设置为远程跟踪分支：

    [gc "refs/remotes/*"]

            reflogExpire = never

            reflogExpireUnreachable = 3 days

可选的配置变量`gc.rerereResolved`指示您先前解决的冲突合并记录的保存期限。这默认为60天。

可选的配置变量`gc.rerereUnresolved`表示保留了多久没有解决的冲突合并记录。这默认为15天。

可选的配置变量`gc.packRefs`确定是否`git gc`运行`git pack-refs`。可以将其设置为“notbare”，以便在所有非裸回购库中启用它，或者可以将其设置为布尔值。这默认为true。

可选配置变量`gc.aggressiveWindow`控制在指定--aggressive选项时优化存储库中对象的增量压缩所花费的时间。值越大，优化增量压缩花费的时间就越多。有关更多详细信息，请参阅git-repack [1]中--window'选项的文档。这默认为250。

同样，可选的配置变量`gc.aggressiveDepth`控制git-repack [1]中的--depth选项。默认值为50。

可选的配置变量`gc.pruneExpire`控制未修剪的松散对象在修剪之前必须经过多久。默认值是“2周前”。

## 注意

`git gc`尽量不要删除在存储库中任何位置引用的对象。特别是，它不仅会保存当前一组分支和标记所引用的对象，还会保留由索引引用的对象，远程跟踪分支，`git filter-branch`refs / original /中保存的引用或reflogs（可引用分支中的提交后来修改或倒带）。如果您希望某些对象被删除而不是，请检查所有这些位置，并决定在您的情况下删除这些引用是否有意义。

另一方面，当`git gc`与另一个进程同时运行时，可能会删除另一个进程正在使用但尚未创建引用的对象。这可能会导致其他进程失败或者可能会损坏存储库，如果其他进程稍后添加对已删除对象的引用。Git有两个功能可以显着缓解这个问题：

1. `--prune`保留修改时间比日期更新的任何对象以及可从其访问的所有对象。

1. 将对象添加到数据库的大多数操作都会更新对象的修改时间（如果该对象已存在，以便应用＃1）。

然而，这些功能并不能提供完整的解决方案，因此，同时运行命令的用户必须忍受一些腐败风险（实践中似乎很低），除非他们关闭自动垃圾收集`git config gc.auto 0`。

## Hooks

该`git gc --auto`命令将运行该`pre-auto-gc`钩子。有关更多信息，请参阅githooks [5]。