有些時候不當心上傳了一些敏感文件(例如密碼), 或者不想上傳的文件(沒及時或忘了加到.gitignore裏的),並且上傳的文件又特別大的時候, 這將致使別人clone你的代碼或下載zip包的時候也必須更新或下載這些無用的文件,所以, 咱們須要一個方法, 永久的刪除這些文件(包括該文件的歷史記錄).html
BFG是用Scala寫的,像git-filter-branch
那樣刪除大的或麻煩的塊,可是速度更快。java
在GitHub上查看項目git
$ bfg --strip-blobs-bigger-than 100M --replace-text banned.txt repo.git
BFG是git-filter-branch
以外的一種更簡單、更快的方法,能夠清除Git存儲庫歷史中的不良數據:github
git-filter-branch
命令很是強大,能夠作BFG不能作的事情——可是BFG更適合上面的任務,由於:數據庫
首先使用--mirror
標誌克隆一個新的repo副本:c#
$ git clone --mirror git://example.com/some-big-repo.git
這是一個 bare 倉庫,這意味着您的普通文件將不可見,但它是存儲庫Git數據庫的完整副本,此時您應該備份它,以確保不會丟失任何東西。服務器
如今你能夠運行BFG來清理你的倉庫:jsp
$ java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
BFG將更新您的提交以及全部分支和標記,使它們保持乾淨,但它不會物理刪除不須要的東西。 檢查存儲庫以確保您的歷史記錄已更新,而後使用標準的git gc
命令去除不須要的髒數據, git如今將這些髒數據視爲多餘的需求:maven
$ cd some-big-repo.git $ git reflog expire --expire=now --all && git gc --prune=now --aggressive
最後,一旦您對您的倉庫的更新狀態感到滿意,請把它從新推回去 (請注意,由於您的clone命令使用了--mirror標誌,因此此推送將更新遠程服務器上的全部引用):google
$ git push
此時,您已經準備好讓每一個人都拋棄舊的repo副本,從新克隆新的原始數據。最好刪除全部舊的克隆,由於它們會有骯髒的歷史,您不想冒險將其推回到您新清理的repo中。
在全部這些示例中,bfg
是java -jar bfg.jar
的別名。
刪除全部名爲'id_rsa'或'id_dsa'的文件:
$ bfg --delete-files id_{dsa,rsa} my-repo.git
刪除全部大於50兆字節的blob:
$ bfg --strip-blobs-bigger-than 50M my-repo.git
將文件*(前綴行'regex:'或'glob:'若是須要)*中列出的全部密碼替換爲' *** remove *** ',不管它們在您的存儲庫中的任何地方:
$ bfg --replace-text passwords.txt my-repo.git
刪除Git中全部名爲'.git'的文件夾或文件—保留的文件名。當從Mercurial等其餘源代碼控制系統遷移到Git時,這些經常會成爲一個問題:
$ bfg --delete-folders .git --delete-files .git --no-blob-protection my-repo.git
對於進一步的命令行選項,您能夠不帶任何參數運行BFG,它將輸出以下所示。
BFG對待你就像一個改過自新的酒鬼:你過去犯過一些錯誤,但如今你已經改過自新了。所以,BFG假定您的最新提交是一個好的提交,其中沒有您但願從歷史記錄中刪除的髒文件。BFG的這一假設保護了您的工做,並讓您安心地知道BFG只是僅僅更改您的倉庫歷史記錄,而不是干預項目的當前文件。
默認狀況下,HEAD
分支是受保護的,雖然它的歷史記錄將被清除,可是最新的提交(這個'技巧')是protected commit(受保護的提交),它的文件層次結構將不會被改變。
若是你想保護幾個分支或標籤的tips(提示)
(不僅是HEAD'頭部'),只需爲BFG命名:
$ bfg --strip-biggest-blobs 100 --protect-blobs-from master,maint,next repo.git
注意:
--strip-blobs-bigger-than 5M
)在受保護的提交中,那麼它不會被刪除—它將保存在您的存儲庫中,即便BFG從之前的提交中刪除了它。若是你想讓BFG刪除一些東西,你須要確保你的當前提交是乾淨的。BFG 10 - 720x 比git-filter-branch
更快,將過夜做業提高到不到10分鐘的做業。
Java 運行時環境 (Java 7 或更高 - BFG v1.12.3 最新的版本支持 Java 6)
就一個jar文件,Scala庫和全部其餘依賴項所有被打包到 downloadable jar.
git-rewrite-history
在 Stack OverflowBFG是自由軟件:您能夠根據自由軟件基金會發布的GNU通用公共許可證、許可證的第3版或(根據您的選擇)任何後續版本的條款從新分發和/或修改它。
BFG的發行是但願它將是有用的,但沒有任何保證;甚至沒有隱含的適銷性或適合某一特定用途的保證。有關更多細節,請參閱GNU通用公共許可證。