# git-gc
> 原文: [https://git-scm.com/docs/git-gc](https://git-scm.com/docs/git-gc)
## 名稱
git-gc - 清理不必要的文件并優化本地存儲庫
## 概要
```
git gc [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune] [--force] [--keep-largest-pack]
```
## 描述
在當前存儲庫中運行許多內務處理任務,例如壓縮文件修訂版(以減少磁盤空間并提高性能),刪除可能從之前調用 _git add_ 創建的無法訪問的對象,打包引用,修剪reflog,rerere元數據或陳舊的工作樹。也可以更新提交圖等輔助索引。
建議用戶定期在每個存儲庫中運行此任務,以保持良好的磁盤空間利用率和良好的運行性能。
一些git命令可以自動運行 _git gc_ ;有關詳細信息,請參見下面的`--auto`標志。如果您知道自己在做什么,并且您想要的是永久禁用此行為而無需進一步考慮,只需執行以下操作:
```
$ git config --global gc.auto 0
```
## OPTIONS
```
--aggressive
```
通常 _git gc_ 運行速度非常快,同時提供良好的磁盤空間利用率和性能。此選項將導致 _git gc_ 更積極地優化存儲庫,但代價是花費更多時間。這種優化的效果是持久的,所以這個選項只需要偶爾使用;每幾百個變更集左右。
```
--auto
```
使用此選項, _git gc_ 檢查是否需要任何內務處理;如果沒有,它退出而不執行任何工作。執行可能會創建許多松散對象的操作后,某些git命令會運行`git gc --auto`。如果存儲庫中有太多松散的對象或太多的包,則需要內務處理。
如果松散對象的數量超過`gc.auto`配置變量的值,則使用`git repack -d -l`將所有松散對象合并為單個包。將`gc.auto`的值設置為0將禁用松散物體的自動包裝。
如果包數超過`gc.autoPackLimit`的值,則使用_的`-A`選項將現有包(標有`.keep`文件或超過`gc.bigPackThreshold`限制的包除外)合并為單個包中git repack_ 。如果估計內存量不足以使`git repack`平穩運行并且未設置`gc.bigPackThreshold`,則也將排除最大包(這相當于使用`--keep-base-pack`運行`git gc`)。將`gc.autoPackLimit`設置為0將禁用包的自動合并。
如果由于許多松散的物體或包裝而需要進行保養,則還將執行所有其他內務處理任務(例如,rerere,工作樹,reflog ......)。
```
--prune=<date>
```
修剪早于日期的松散對象(默認為2周前,可由配置變量`gc.pruneExpire`覆蓋)。 --prune =所有修剪松散的對象,無論其年齡如何,如果另一個進程同時寫入存儲庫,則會增加損壞的風險;請參閱下面的“注意”。 --prune默認開啟。
```
--no-prune
```
不要修剪任何松散的物體。
```
--quiet
```
取消所有進度報告。
```
--force
```
即使可能在此存儲庫上運行另一個`git gc`實例,也強制`git gc`運行。
```
--keep-largest-pack
```
除最大包裝外的所有包裝和標有`.keep`文件的包裝都合并為一個包裝。使用此選項時,將忽略`gc.bigPackThreshold`。
## 組態
可以設置可選配置變量`gc.reflogExpire`以指示每個分支的reflog中的歷史條目在此存儲庫中保持可用的時間。該設置表示為時間長度,例如 _90天_或 _3個月_。默認為 _90天_。
可以設置可選配置變量`gc.reflogExpireUnreachable`以指示不屬于當前分支的歷史reflog條目在此存儲庫中保持可用的時間長度。這些類型的條目通常是使用`git commit --amend`或`git rebase`的結果創建的,并且是修改或重組發生之前的提交。由于這些更改不是當前項目的一部分,因此大多數用戶希望盡快使其過期。此選項默認為 _30天_。
上述兩個配置變量可以賦予模式。例如,這僅將非默認到期值設置為遠程跟蹤分支:
```
[gc "refs/remotes/*"]
reflogExpire = never
reflogExpireUnreachable = 3 days
```
可選配置變量`gc.rerereResolved`表示您保留先前解決的沖突合并記錄的時間長度。默認為60天。
可選配置變量`gc.rerereUnresolved`表示保留未解決的沖突合并記錄的時間長度。默認為15天。
可選配置變量`gc.packRefs`確定 _git gc_ 是否運行 _git pack-refs_ 。這可以設置為“notbare”以在所有非裸存儲庫中啟用它,或者可以將其設置為布爾值。默認為true。
可選配置變量`gc.writeCommitGraph`確定 _git gc_ 是否應該運行 _git commit-graph write_ 。這可以設置為布爾值。默認為false。
可選配置變量`gc.aggressiveWindow`控制在指定-aggressive選項時優化存儲庫中對象的增量壓縮所花費的時間。值越大,優化增量壓縮所花費的時間就越多。有關詳細信息,請參閱 [git-repack [1]](https://git-scm.com/docs/git-repack) 中--window選項的文檔。默認為250。
類似地,可選配置變量`gc.aggressiveDepth`控制 [git-repack [1]](https://git-scm.com/docs/git-repack) 中的--depth選項。默認為50。
可選配置變量`gc.pruneExpire`控制未被引用的松散對象在被修剪之前必須有多長。默認為“2周前”。
可選配置變量`gc.worktreePruneExpire`控制在`git worktree prune`刪除之前過時工作樹的年齡。默認為“3個月前”。
## 筆記
_git gc_ 非常努力地不刪除存儲庫中任何位置引用的對象。特別是,它不僅會保留當前分支和標記集引用的對象,還會保留由 _git filter-branch_ 在refs / original /中保存的索引,遠程跟蹤分支,引用引用的對象。或者reflogs(可以引用稍后修改或重繞的分支中的提交)。如果您希望某些對象被刪除而它們不是,請檢查所有這些位置,并確定在您的情況下刪除這些引用是否有意義。
另一方面,當 _git gc_ 與另一個進程同時運行時,存在刪除另一個進程正在使用但尚未創建引用的對象的風險。如果其他進程稍后添加對已刪除對象的引用,則這可能只會導致其他進程失敗或可能損壞存儲庫。 Git有兩個功能可以顯著緩解這個問題:
1. 修改時間比`--prune`日期更新的任何對象以及從中可以訪問的所有對象。
2. 將對象添加到數據庫的大多數操作都會更新對象的修改時間(如果已存在),以便應用#1。
但是,這些功能缺乏完整的解決方案,因此同時運行命令的用戶必須承受一定的腐敗風險(實際上似乎很低),除非他們用 _git config gc.auto關閉自動垃圾收集。 0_ 。
## 掛鉤
_git gc --auto_ 命令將運行 _pre-auto-gc_ 掛鉤。有關更多信息,請參閱 [githooks [5]](https://git-scm.com/docs/githooks) 。
## 也可以看看
[git-prune [1]](https://git-scm.com/docs/git-prune) [git-reflog [1]](https://git-scm.com/docs/git-reflog) [git-repack [1]](https://git-scm.com/docs/git-repack) [git-rerere [1]](https://git-scm.com/docs/git-rerere)
## GIT
部分 [git [1]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree