一旦所有引用一些承諾(S)和其相關的文件(S)-really,基礎Git對象(即那些提交去樹木和斑點)-are沒了,對象成爲資格垃圾收集。然而,他們實際上並不會收集被收集,直到某些東西運行git gc
(或git prune
)和它們至少與「修剪時間」一樣長。
默認剪枝時間是兩週,但您可以降低它,例如,git gc --prune=yesterday
或--prune=10.minutes.ago
或類似。如果此時間很短,請確保沒有人在存儲庫中創建新對象。
擺脫全部對各種Git對象的引用可能比看起來更難。顯而易見的是分支名稱和標籤名稱。這些參考名稱通常也有推薦日誌,並且本身有一個額外的推薦日誌HEAD
;所有這些reflog包含引用,然後保持對象活着。刪除分支名稱(當前)刪除分支的引薦日誌,但HEAD
的引用日誌中的引用日誌保留。
的引用日誌條目本身到期,默認情況下,在90天內爲可達對象和可達者30天,與此可達性由相應的參考電流值來確定。如果只有HEAD
reflog和HEAD
本身沒有分離,那麼reflog引用指向一個不可達的提交(根據定義:如果HEAD
附加到分支,然後HEAD
只包含分支名稱,並且我們已經表示沒有分支名稱指向提交本身,也不指向提交的後代),因此只適用較短的到期時間。你可以用git reflog expire --expire-unreachable=...
進一步縮短,使用相同的語法與git gc --prune=...
,雖然你當然會被到期所有這樣引用日誌不可達的條目,除非你限制這HEAD
(那麼你將撲殺只HEAD
的可達條目)。
除了這些,有可能在特殊*_HEAD
名字中的一個有一個參考(ORIG_HEAD
,MERGE_HEAD
,CHERRY_PICK_HEAD
,等等)。不過,這種情況不太可能發生。
我不這麼認爲;在我的快速實驗中,即使'git gc --prune = all --aggressive'都不起作用,'git'手冊頁建議不要使用'--prune = all',因爲它在某些情況下不安全。 –