The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

介紹好用工具:BFG Repo-Cleaner (刪除 Git 儲存庫大型歷史檔案)

由於早期的 Subversion (SVN) 專案都擺在公司內部,儲存庫的大小不太會去管控,以致於有些專案含有非常大量的文件,我們就有個專案的 Docs 目錄下擁有超過 1GB 的資料,想當然爾在移轉到 Git 之後,所有的檔案都將被留下,可想而知這種儲存庫要搬上雲端有多麼困難,本文將介紹一套以 Java 寫成的好用工具 BFG Repo-Cleaner 可以幫助我快速刪除版本歷史紀錄中不需要出現的檔案或目錄,以大幅減少 Git 儲存庫的大小。

首先,請先下載 BFG Repo-Cleaner 的 jar 檔,我目前所下載的檔案為 bfg-1.11.8.jar,你可以將檔案更名為 bfg.jar 以方便之後執行:

接著請確認 java.exe 執行檔的位置,或將 java.exe 執行檔所在目錄加入 PATH 環境變數。

再來��著輸入以下指令可查詢 bfg.jar 的使用方法說明:

"C:\Program Files (x86)\Java\jre7\bin\java.exe" -jar bfg.jar
最後就可以準備執行清除超大檔案的任務。
 
步驟 1:清除特定儲存庫的範例 ( 以下以清空 Bare Repository 為範例 )
 
刪除特定已存在的資料夾,可以加上 --delete-folders 參數,不過 BFG Repo-Cleaner 這套工具預設會「保護」目前最新版中的檔案,只要檔案還出現在「最新版」( master 分支最新的版本 ),預設會對這些檔案做出保護,並不會主動刪除這些檔案,因此,你還必須加上 --no-blob-protection 才能真正刪除這些檔案。
"C:\Program Files (x86)\Java\jre7\bin\java.exe" -jar bfg.jar --no-blob-protection --delete-folders Docs MyBigProject.git

步驟 2:清空刪除的 blob 物件
 
在步驟 1 清除資料後,其實還沒有刪除任何檔案,他只更新了你 Git 儲存庫的 tree 物件與 tag 物件而已,你還必須執行以下指令,才能徹底清除這些用不到的 blob 物件:
cd MyBigProject
git reflog expire --expire=now --all
git gc --prune=now --aggressive
 
步驟 3:上傳 ( push ) 儲存庫
 
最後一個步驟,當然是將更新過後的儲存庫透過 git push 上傳到遠端儲存庫。
git push
 
更多的刪除物件技巧,就請參考 BFG Repo-Cleaner 官方網站的說明囉!
 
相關連結