1

我有一個相當大的存儲庫(11 GB,900,000多個文件),並且在合理的時間內迭代時遇到問題。有些分析後,真正的瓶頸似乎是git的更新索引:如何優化git update-index?

$ time git update-index --replace $path > /dev/null 

real 0m5.766s 
user 0m1.984s 
sys  0m0.391s 

這使得天的不堪數得到的文件列表。有什麼方法可以加快更新索引操作?

對於它的價值,我在Windows 7上運行的cygwin

編輯:把更多的上下文的問題。

大型存儲庫來自SVN導入,並且包含許多不應該存在於存儲庫中的二進制文件。但是,我想保留提交歷史記錄和提交日誌。爲了做到這一點,我試圖用文件散列替換二進制文件的內容,這應該壓縮存儲庫並允許我保留歷史記錄。

+0

這是一個已知的問題,git的大問題的確是它的速度。一個解決方案是拆分你的項目(因爲90萬個文件是很大的)我認爲它是一個重複的:http://stackoverflow.com/questions/3313908/git-is-really-slow-for-100-000-objects - 任何修復 – Vince

+0

@Vince嗯,在大規模回購規模的速度。幾乎任何回購股票的任何一天,我仍然寧願發行'git branch'然後發行'svn copy'。 – Christopher

+0

@Christopher是啊是的,我不是說這是一個showstopper。我試着用10,000個文件進行回購,它工作得很好。無論如何,如果它是一個問題,有子模塊的功能。在這種精確的情況下,900,000個文件,我相信並不是唯一一個讓Git感到困惑的人... – Vince

回答

2

您要使用的BFG Repo-Cleaner,更快,更簡單git-filter-branch替代專門針對混帳回購刪除大文件設計。

下載BFG jar(需要Java 6或以上),並運行此命令:

$ java -jar bfg.jar --strip-blobs-bigger-than 1MB my-repo.git 

規模超過任何1MB的文件(不在你最新提交)將從您的Git中移除版本庫的歷史記錄,並替換爲.git-id文件,其中包含原始文件的舊Git hash-id(與替換二進制文件的內容與文件散列問題的要求)。

然後可以使用git gc清理掉死數據:

$ git gc --prune=now --aggressive 

的BFG通常10-50x比運行git-filter-branch更快的選項都圍繞這兩個常見的用例定製:

  • 刪除瘋狂大文件
  • 刪除密碼,證件個&其他私人數據

全面披露:我是BFG回購清潔的作者。