2012-10-23 49 views
7

有兩種情況,我很感興趣的使用Git存儲庫可以執行併發操作嗎?

  • 該信息庫共享和兩個用戶想在同一時間推修改它
  • 我想安排在夜間或每週的「GC」使用cron作業。它運行時有人想在操作過程中推送或克隆。

在這兩種情況下是否存在腐敗風險?

+0

對於#1,我假設你在談論併發推送到不同的分支?同時推動到同一個分支在SO的其他地方回答。 – cmbuckley

+0

你能提供一個鏈接嗎? – dromodel

+2

[q8424232](http:// stackoverflow。COM /問題/ 8424232 /是同時發生的,混帳推,總是安全的,如果海第二推只,具有快速,向前); [q6028141](http://stackoverflow.com/questions/6028141/concurrent-git-pull-and-push-on-same-remote-repo-from-different-locations)也許很有趣。 – cmbuckley

回答

7

Git允許通過使用Pessimistic Concurrency Control進行併發操作。

必要時,git會創建一些特殊文件來充當鎖。

特別是,每次操作修改索引時,git都會在.git目錄中創建一個名爲index.lock的文件來鎖定共享資源。 Git根據需要創建其他鎖文件:例如,在git index-pack操作期間創建.keep文件。

一般來說,你不應該擔心與git併發操作:它是精心設計的,以支持他們。

有人可能會告訴你不應該擔心用cron作業執行gc,因爲git本身會不時地觸發gc。即使這是真的,在man page本身建議:

Users are encouraged to run this task on a regular basis 
within each repository to maintain good disk space utilization 
and good operating performance. 

因此,我認爲這不是一個壞主意,安排作業任務運行git的垃圾回收。我只是想知道這是否是一種過早的優化,或者您是否試圖解決一個真實的,有問題的問題。我個人從未遇到需要我手動運行gc的問題,但如果您的情況非常不同,我不會感到驚訝。

2

通常,「git gc」可能會刪除另一個併發進程 正在使用但尚未創建引用的對象。
Git 2.12(2017年第1季度)有更多。

請參閱commit f1350d0(2016年11月15日)作者:Matt McCutchen (mattmccutchen)
(在commit 979b82fJunio C Hamano -- gitster --合併,2017年1月10日)

而看到Jeff King's comment:混蛋

現代版本做兩件事情來幫助這個:

  • 任何對象「近期」對象引用的內容(在2周內)也被認爲是最近的。所以,如果你創建一個新的提交 對象指向一棵樹,你引用提交 那棵樹被保護

  • 當一個對象寫入優化掉了,因爲我們已經擁有了 對象甚至之前,git會更新的mtime上的文件(遊離物或 打包文件),以清新它

這是不完美的,雖然。您可以決定引用現有的 對象,就像它被刪除一樣。修剪過程本身並不是原子的(並且這很難做到,僅僅是因爲我們在文件系統中承諾了我們的 )。

如果你有長時間運行的數據(例如,一個臨時索引文件,可能會在幾天或幾周內從字面上圍坐)我認爲這是一個潛在的 問題。並且解決方案可能會以某種方式使用引用來將 指向您的對象。
如果您擔心短期操作, 有人碰巧同時運行git-gc,我同意這是一個可能的 問題,但我懷疑在實踐中可以忽略的一些問題。

對於一個繁忙的多用戶服務器,我建議完全關閉auto-gc, ,並用「-k」手動重新包裝以保證安全。

這就是爲什麼git gc man page現在包括:

在另一方面,「git gc」時與另一個進程同時運行, 有它的刪除,其他進程正在使用對象的風險 但尚未創建參考。這可能會導致其他進程 失敗,或者可能會損壞存儲庫,如果其他進程稍後將 引用添加到已刪除的對象。

Git有兩個特點是顯著減輕這個問題:

  • 與修改時間更新比--prune日期保持, 一切從它可到達沿着任何對象。

  • 將對象添加到數據庫的大多數操作會更新該對象的修改時間(如果該對象已存在),以便應用#1 。

,但是這些功能達不到一個完整的解決方案,所以誰 同時運行命令,用戶不得不忍受腐敗的一些風險(這 似乎是在實踐中低),除非他們關閉自動垃圾 'git config gc.auto 0'收集。

相關問題