Git gc 或修剪與接收並發

Git gc 或修剪與接收並發

有兩台主機A、B。

A 為 Git 提供服務並接收 B 推播的轉速。

B 只推,從不接收,除非自己拉。

可以將 B 設定為 GC 或修剪轉速,因為不用擔心並發操作,但當 A 進行 GC 或修剪時,B 可以將轉速推至 A 嗎?會發生什麼事?

我基本上想知道在運行 GC 或修剪時我是否要拆除 A 的通訊,或者沒有必要這樣做。

答案1

Git GC手冊頁狀態:

如果 git gc 與另一個進程同時運行,則存在刪除另一個進程正在使用但尚未建立引用的物件的風險。這可能只會導致其他進程失敗,或者如果其他進程稍後會新增已刪除物件的引用,則可能會損壞儲存庫。 Git 有兩個功能可以顯著緩解這個問題:

  1. 修改時間晚於 --prune 日期的任何物件以及可從其存取的所有內容都會被保留。

  2. 大多數將物件新增至資料庫的操作都會更新該物件的修改時間(如果該物件已存在),因此 #1 適用。

然而,這些功能不足以提供完整的解決方案,因此同時執行命令的使用者必須承受一定的損壞風險(實際上這種風險似乎很低)。

並進一步:

--prune=<date>

修剪早於日期的鬆散物件(預設為 2 週前,可透過配置變數 gc.pruneExpire 覆蓋)。--prune=now無論其年齡如何,都會修剪鬆散的對象,如果另一個進程同時寫入儲存庫,則會增加損壞的風險;請參閱下面的“註釋”。 --prune 預設為啟用。

所以是的,有風險。但是,如果 A 和 B 的時鐘相當同步,並且您應用於存儲庫的 Git 命令不會花費超過兩週的時間來完成,那麼我會認為並發推送到同一存儲庫並進行 GC 的風險是可以接受。

相關內容