?
This document uses PHP Chinese website manual Release
git-gc - 清理不必要的文件并優(yōu)化本地存儲庫
git gc [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune] [--force]
在當前存儲庫中運行許多內(nèi)務(wù)處理任務(wù),例如壓縮文件修訂(以減少磁盤空間并提高性能)并移除可能由之前git add
調(diào)用創(chuàng)建的不可達對象。
鼓勵用戶在每個存儲庫中定期運行此任務(wù),以保持良好的磁盤空間利用率和良好的操作性能。
一些git命令可能會自動運行git gc
; --auto
詳細信息請參閱下面的標志。如果您知道自己在做什么,并且所有您想要的都是永久禁用此行為而無需進一步考慮,請執(zhí)行以下操作:
$ git config --global gc.auto 0
--aggressive
通常git gc
運行速度很快,同時提供良好的磁盤空間利用率和性能 此選項將導致git gc
更積極地優(yōu)化存儲庫,但花費更多時間。這種優(yōu)化的效果是持久的,所以這個選項只需要偶爾使用; 每隔幾百個變更集左右。
--auto
使用此選項,git gc
檢查是否需要進行任何清潔工作; 如果沒有,它會退出而不執(zhí)行任何工作。一些git命令git gc --auto
在執(zhí)行可能會產(chǎn)生許多松散對象的操作之后運行。
如果存儲庫中的松散對象太多或包裝太多,則需要進行內(nèi)務(wù)處理。如果松散對象的數(shù)量超過了gc.auto
配置變量的值,則所有松散對象都將使用組合到一個包中git repack -d -l
。將值設(shè)置gc.auto
為0將禁用自動填充松散物體。
如果包裝數(shù)量超過了價值gc.autoPackLimit
,那么現(xiàn)有包裝(標有.keep
文件的包裝除外)將通過使用-A
選項合并到一個包裝中git repack
。設(shè)置gc.autoPackLimit
為0將禁用自動合并包裝。
--prune=<date>
修剪比日期更舊的松散對象(默認為2周前,可由配置變量覆蓋gc.pruneExpire
)。--prune =不管年齡大小,都修剪松散的物體,并且如果另一個進程同時寫入存儲庫,則會增加腐敗風險; 請參閱下面的“注意事項”。--prune默認打開。
--no-prune
不要修剪任何松動的物體。
--quiet
取消所有進度報告。
--force
git gc
即使可能有另一個git gc
實例在此存儲庫上運行,也強制運行。
可選配置變量gc.reflogExpire
可以設(shè)置為指示每個分支的reflog中的歷史條目應(yīng)該在此存儲庫中保持可用的時間。該設(shè)置表示為一段時間,例如90 days
或3 months
。它默認為90 days
。
可選配置變量gc.reflogExpireUnreachable
可設(shè)置為指示不屬于當前分支的歷史請求日志條目在此存儲庫中保持可用的時間。這些類型的條目通常是由于使用git commit --amend
或git rebase
而創(chuàng)建的,并且是在修改或重新發(fā)生之前的提交。由于這些更改不是當前項目的一部分,因此大多數(shù)用戶都希望盡快過期。該選項默認為30 days
。
上述兩個配置變量可以賦予一個模式。例如,這會將非默認到期值設(shè)置為遠程跟蹤分支:
[gc "refs/remotes/*"] reflogExpire = never reflogExpireUnreachable = 3 days
可選的配置變量gc.rerereResolved
指示您先前解決的沖突合并記錄的保存期限。這默認為60天。
可選的配置變量gc.rerereUnresolved
表示保留了多久沒有解決的沖突合并記錄。這默認為15天。
可選的配置變量gc.packRefs
確定是否git gc
運行git pack-refs
??梢詫⑵湓O(shè)置為“notbare”,以便在所有非裸回購庫中啟用它,或者可以將其設(shè)置為布爾值。這默認為true。
可選配置變量gc.aggressiveWindow
控制在指定--aggressive選項時優(yōu)化存儲庫中對象的增量壓縮所花費的時間。值越大,優(yōu)化增量壓縮花費的時間就越多。有關(guān)更多詳細信息,請參閱git-repack [1]中--window'選項的文檔。這默認為250。
同樣,可選的配置變量gc.aggressiveDepth
控制git-repack [1]中的--depth選項。默認值為50。
可選的配置變量gc.pruneExpire
控制未修剪的松散對象在修剪之前必須經(jīng)過多久。默認值是“2周前”。
git gc
盡量不要刪除在存儲庫中任何位置引用的對象。特別是,它不僅會保存當前一組分支和標記所引用的對象,還會保留由索引引用的對象,遠程跟蹤分支,git filter-branch
refs / original /中保存的引用或reflogs(可引用分支中的提交后來修改或倒帶)。如果您希望某些對象被刪除而不是,請檢查所有這些位置,并決定在您的情況下刪除這些引用是否有意義。
另一方面,當git gc
與另一個進程同時運行時,可能會刪除另一個進程正在使用但尚未創(chuàng)建引用的對象。這可能會導致其他進程失敗或者可能會損壞存儲庫,如果其他進程稍后添加對已刪除對象的引用。Git有兩個功能可以顯著緩解這個問題:
--prune
保留修改時間比日期更新的任何對象以及可從其訪問的所有對象。
將對象添加到數(shù)據(jù)庫的大多數(shù)操作都會更新對象的修改時間(如果該對象已存在,以便應(yīng)用#1)。
然而,這些功能并不能提供完整的解決方案,因此,同時運行命令的用戶必須忍受一些腐敗風險(實踐中似乎很低),除非他們關(guān)閉自動垃圾收集git config gc.auto 0
。
該git gc --auto
命令將運行該pre-auto-gc
鉤子。有關(guān)更多信息,請參閱githooks [5]。