一些時候由於開發初期經驗不足和貪圖方便, 會把一些不應該提交到 Git 的文件上傳到 Github, 帶來一系列安全問題, 更有可能是把一些大文件上傳到 GitHub 上, 導致項目非常臃腫, 每次 pull、push 都要花費很多時間.
超 100000 個 GitHub 代碼庫泄露了 API 或加密密鑰
關於如何更好的管理大文件, 可以閱讀 更好的在 Git 項目中保存大文件(Git LFS 的使用) - 質子 - 博客園 .
這時候就可以尋求一些特殊的工具的幫助, BFG Repo-Cleaner by rtyley 就是這樣一款工具, 可以從 Git 項目中徹底刪除某一個文件的歷史記錄.
下載及運行
BFG Repo-Cleaner 是由 Scala (一種JVM語言) 寫成, 所以會被編譯成 jar 包, 下載非常方便, 下載地址可在官網或直接點擊 bfg 下載地址 .
但因此運行 bfg.jar
就需要 Java 環境, 關於 Java 環境的安裝, macOS可以參考 macOS 的 JDK 安裝問題 , 而 Windows 已經有很多人提過, 不做贅述.
讓它完全消失
首先需要自行從項目中刪除不想要的文件並提交, 這樣能最大程度避免誤刪、誤操作.
## 首先需要自行從項目中刪除不想要的文件
rm file-to-delete
## 提交改動, 即最新分支是不包含要被刪除的文件
git commit -m "刪除 file-to-delete"
git push
然后使用 --mirror
命令裸克隆(clone)整個項目.
git clone --mirror git@github.com:username/some-project.git
## 根據經驗, 如果是包含大文件的項目, 使用 ssh 將會克隆的非常緩慢, 可以改用 https
git clone --mirror https://github.com/username/some-project.git
## 這個時候, 你的當前目錄下就會產生一個名為 some-project.git 的文件夾
接着開始刪除文件歷史.
## 根據情況的不同, bfg 可選擇根據文件大小刪除
java -jar bfg.jar --strip-blobs-bigger-than 100M some-project.git
## 根據情況的不同, bfg 可選擇直接根據名字刪除
java -jar bfg.jar --delete-files name-of-file some-project.git
任選以上命令執行其中一個后, 執行 git gc
真正刪除這些文件並提交.
cd some-project.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push
這時候那個文件就會消失了…