徹底刪除 Git 項目中的文件(BFG Repo-Cleaner 用法)


一些時候由於開發初期經驗不足和貪圖方便, 會把一些不應該提交到 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

這時候那個文件就會消失了…


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM