我有時運行git gc
來清理文件並提高性能,通常使用cronjob。但是,我也使用git-new-workdir
來創建一個帶有自己索引的新工作目錄。我應該爲每個工作目錄運行'git gc'嗎?
在每個工作目錄上運行git gc
是否合理?爲什麼?
我有時運行git gc
來清理文件並提高性能,通常使用cronjob。但是,我也使用git-new-workdir
來創建一個帶有自己索引的新工作目錄。我應該爲每個工作目錄運行'git gc'嗎?
在每個工作目錄上運行git gc
是否合理?爲什麼?
不,因爲底層存儲庫由所有這些單獨的工作目錄共享,並且git gc
在底層存儲庫上運行。
這裏有一個額外的(小的但真實的)危險。運行git gc
時,它會清理和壓縮存儲庫對象,並放棄那些未引用的對象。某些參考文獻可能僅在索引中,或者僅在HEAD
(處於「分離的HEAD」模式下)。但請注意,在git-new-workdir
的說明中,部分說明如下:
它只是爲您設置一個新的工作目錄(帶有自己的索引)。
參考隱藏在其他一些指標,即,這不是一個與見過任何索引工作DIR-是不可見的git gc
,使它們符合刪除。
大多數情況下,這不會成爲一個問題,因爲git gc
運行git prune
具有未引用對象的默認到期時間(即2周)。只有索引參考文件是在git add
文件中出現,但不包含git commit
結果,因此如果您至少在兩週內未將文件提交至git add
,那麼這些明顯陳舊的參考文件將會消失......並且您始終可以修復問題git add
- 根據需要再次生成文件。
使用分離的HEAD創建匿名分支時會出現更隱蔽的版本。您鏈接的頁面沒有提及它,但new-workdir腳本沒有(也不能)在單獨的「新工作目錄」中維護這些分離的HEAD(這些新目錄中的每個目錄都有其自己的.git
目錄以及它自己的HEAD
參考) 。如果git gc
在其他工作目錄中運行,則可能會從基礎存儲庫中丟棄兩週或更多周的舊分離提交鏈。
由於腳本共享「更深」的引用(包括分支和標籤),這對於「真實」分支和標籤不是問題。也就是說,在一個工作目錄中更新分支X會更新所有其他工作目錄中的分支X,以便無法丟失參考。
總之(太晚了:-))如果你不把HEAD分離超過一個星期,你就相當安全。
不,這沒有意義。運行一次。
git gc
不會修改工作目錄中的任何內容。它只有修改.git
目錄中的內容。 git-new-workdir
的整個點是在多個工作目錄之間共享一個.git
,所以從兩個不同的工作目錄運行git gc
與從相同目錄運行兩次是相同的;也就是說,這是毫無意義的。