
有兩台主機A、B。
A 為 Git 提供服務並接收 B 推播的轉速。
B 只推,從不接收,除非自己拉。
可以將 B 設定為 GC 或修剪轉速,因為不用擔心並發操作,但當 A 進行 GC 或修剪時,B 可以將轉速推至 A 嗎?會發生什麼事?
我基本上想知道在運行 GC 或修剪時我是否要拆除 A 的通訊,或者沒有必要這樣做。
答案1
Git GC手冊頁狀態:
如果 git gc 與另一個進程同時運行,則存在刪除另一個進程正在使用但尚未建立引用的物件的風險。這可能只會導致其他進程失敗,或者如果其他進程稍後會新增已刪除物件的引用,則可能會損壞儲存庫。 Git 有兩個功能可以顯著緩解這個問題:
修改時間晚於 --prune 日期的任何物件以及可從其存取的所有內容都會被保留。
大多數將物件新增至資料庫的操作都會更新該物件的修改時間(如果該物件已存在),因此 #1 適用。
然而,這些功能不足以提供完整的解決方案,因此同時執行命令的使用者必須承受一定的損壞風險(實際上這種風險似乎很低)。
並進一步:
--prune=<date>
修剪早於日期的鬆散物件(預設為 2 週前,可透過配置變數 gc.pruneExpire 覆蓋)。
--prune=now
無論其年齡如何,都會修剪鬆散的對象,如果另一個進程同時寫入儲存庫,則會增加損壞的風險;請參閱下面的“註釋”。 --prune 預設為啟用。
所以是的,有風險。但是,如果 A 和 B 的時鐘相當同步,並且您應用於存儲庫的 Git 命令不會花費超過兩週的時間來完成,那麼我會認為並發推送到同一存儲庫並進行 GC 的風險是可以接受。