初次使用 git 的“核彈級選項”:filter-branch 從倉庫中刪除文件


當初看 Pro Git 時就被作者這個“核彈級選項”的稱呼嚇到了,因此一直沒敢好奇地去嘗試。核彈啊,用對了威力無窮,用錯了破壞力無窮!

但是,今天,我不得不用了,因為我想把我的原來寫一些代碼放到 github 上去公開。由於之前沒想過要公開,到上傳時才發現不能上傳大於50M的文件。

折騰了半天,還是無法上傳,於是,整個命令出來了:

  git filter-branch --tree-filter ' rm -rf files_to_remove ' --prune-empty -f HEAD --all

命令挺復雜的,所以我是在一個 clone 出來的倉庫里先試運行。先解釋下各個參數:

  • --tree-filter表示修改文件列表。
  • --msg-filter表示修改提交信息,原提交信息從標准輸入讀入,新提交信息輸出到標准輸出。
  • --prune-empty表示如果修改后的提交為空則扔掉不要。在一次試運行中我發現雖然文件被刪除了,但是還剩下個空的提交,就查了下 man 文檔,找到了這個選項。
  • -f是忽略備份。不加這個選項第二次運行這個命令時會出錯,意思是 git 上次做了備份,現在再要運行的話得處理掉上次的備份。
  • --all是針對所有的分支。

試運行了幾次,看到 40 多次提交逐一被重寫,然后檢查下,發現要刪除的文件確實被刪除了。於是高興地到 github 建立新倉庫,並上傳了。

折騰完畢,我更加喜歡 git 了 :-)

下面是具體的使用方法,主要是要gc,再覆蓋到遠程倉庫。

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <your-file-name>'
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git fsck --full --unreachable
git repack -A -d
git gc --aggressive --prune=now
git push --force origin master

------------------
2019-06-25更新,--all參數好像不能使用了,其實有更方便的第三方工具BFG可以使用,支持指定文件大小和文件名。
https://rtyley.github.io/bfg-repo-cleaner/

順便也寫下BFG的使用方式吧

首先倉庫要使用bare方式,克隆的時候要加上--bare或者--mirror選項。

刪除100M以上的文件 

java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git

刪除test.sdf文件 

java -jar bfg.jar --delete-files test.sdf some-big-repo.git

刪除_Boot 文件夾

java -jar bfg.jar --delete-folders _Boot some-big-repo.git

 最后要gc,再push到遠程倉庫

git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push --force --all


免責聲明!

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



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