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

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

首先，請先下載 [BFG Repo-Cleaner](http://rtyley.github.io/bfg-repo-cleaner/) 的 jar 檔，我目前所下載的檔案為 **bfg-1.11.8.jar**，你可以將檔案更名為 **bfg.jar** 以方便之後執行：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b5f2766254b6a0202442-image_2527.png)

接著請確認 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](http://rtyley.github.io/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](http://rtyley.github.io/bfg-repo-cleaner/) 官方網站的說明囉！

**相關連結**

-   [BFG Repo-Cleaner by rtyley](http://rtyley.github.io/bfg-repo-cleaner/)
