2012-09-18 40 views
17

我們有一個包含源代碼和二進制文件的git repo。裸回購現已達到〜9GB,克隆它需要很長時間。大部分時間都花在「遠程:壓縮對象」上。在提交一個更大的二進制文件的新版本之後,獲取花費很長時間,也花費在服務器上壓縮對象。修復由於大的二進制文件而變慢的git repo

看完之後git pull without remotely compressing objects我懷疑二進制文件的delta壓縮會讓我們感到困擾,但我並不是100%確定如何去解決這個問題。

哪些具體步驟來解決服務器上的裸回購?我的猜測:

  • 添加如「* .zip文件-Delta」條目我想進入的.git /信息的所有分機/屬性
  • 運行「git的重新包裝」,更與何選擇?是否-adF重新包裝所有內容,並在給定的文件類型上沒有進行過增量壓縮的情況下給我一個回購協議?
  • 運行'git prune'。我以爲這是自動完成的,但在運行它,當我打得四處說回購的裸克隆由〜2GB減少大小
  • 克隆回購,與我在git的添加相同的條目添加並提交.gitattributes在裸回購/信息/屬性

上午我到的東西?

更新:

在這一些有趣的測試結果。今天,我開始了一個有問題的回購的裸體克隆。我們的4GB內存不夠強大的服務器耗盡內存並開始交換。 3小時後,我放棄了......

然後我不是克隆了我的最高最新的工作副本裸露的回購協議。在工作站之間克隆一個花費約5分鐘。然後我把它推到服務器上作爲一個新的回購。克隆回購只花了7分鐘。

如果我正確地解釋這一點,更好的包裝回購進行更好,即使沒有禁用增量壓縮二進制文件。我想這意味着上述步驟確實是我想要在短期內完成的,但是另外我需要找出如何限制git允許用於打包/壓縮服務器的內存量,這樣我就可以避免交換。

如果它的事項:服務器運行的git 1.7.0.4和工作站上運行1.7.9.5。

更新2:

我也對我的testrepo下面的步驟,並認爲我將有機會做他們的服務器上(備份後)

  • 限制使用內存包裝時對象

    混帳配置pack.windowMemory百米
    混帳配置包。對於一些擴展

    回聲 '與* .tar.gz -Delta' >>資訊/ packSizeLimit200米

  • 禁用增量壓縮屬性
    回聲 '* .tar.bz2格式-Delta' >>信息/屬性
    回聲 '* .bin文件-Delta' >>資訊/屬性
    回聲 '*。PNG-δ' >>資訊/屬性

  • 重新包裝庫,收集垃圾

    混帳重新包裝-a -d -F --window內存百米--max盒大小的200米
    混帳GC

更新3:

此操作後的一些意想不到的副作用:Issues after trying to repack a git repo for improved performance

+3

將存儲二進制文件在其他地方是一個選項? Git真的很糟糕,已經被公認的大型二進制文件。這就是爲什麼有[分開](http://caca.zoy.org/wiki/git-bigfiles)[產品](http://git-annex.branchable.com/)爲... – eis

+0

當我們從git開始,我們添加了uC二進制文件,我們的rootfs和工具鏈,只需檢查一下git修訂版即可獲得過去的完整快照。我們對git的預測不夠充分,我們對此一無所知。我打算正確地解決這個問題(一直在看git-annex,但不知道git-bigfiles),但作爲一個短期解決方案,我想盡可能提高當前回購的性能。 – anr78

+0

我覺得將你的開發環境/工具鏈存儲在虛擬機中是最好的做法(如果你絕對必須存儲你的開發環境的不同版本,只需在你的倉庫之外存儲一個新的磁盤映像)。 –

回答

1

你應該使用不同的機制來存儲大的二進制文件,如果它們是從你不能存儲它們的東西生成的,只是生成它們的代碼,否則我建議將它們全部移到單個目錄中,並用rsync或svn取決於您的需要。

+0

合理的建議,但不適用於我們的案例。最大的(也是最有問題的)二進制文件是tar.bz2的rootfs文件,需要數小時才能生成。 – anr78

+3

我想這個rootfs上的文件中很少有文件實際上會對每個版本進行更改,所以在這種情況下可能會更聰明,而不是壓縮它們,而是直接將它們添加到回購庫中(只是爲了防止這種情況不夠清楚,請添加整個目錄你添加到焦油而不是結果tar.bz2文件),這樣你的差異應該更小,因爲git不能很好地處理差異二進制文件。 – xception

7

雖然您的問題是關於如何使您當前的回購更有效,但我認爲這不可行。

隨波逐流的建議:

  1. 將你的大二進制文件從你的回購
  2. 移動你的開發環境到虛擬機映像:https://www.virtualbox.org/
  3. 使用此Python腳本來清潔您的回購那些大的二進制blob(我用它在我的回購和它工作很好)https://gist.github.com/1433794
+0

我絕對同意這個策略,以求更持久的解決方案。我沒有在開發環境中使用vm,而是考慮將版本存儲在服務器上,並讓回購中的文件指向當前版本。但是,你確定當前的回購不能更有效率嗎?如果我理解我所鏈接的帖子,應該可以讓它更好一點。如果我可以擺脫「遠程:壓縮對象」只爲未來的提取(而不是初始克隆),這本身會有所幫助。 – anr78