git 徹底清除歷史提交中的大文件

原因:在使用 git 開發的過程中,會出現例如:一些敏感數據、構建之後的 jar 包,不小心 git push 到 gitlab 或 github 中,這個時候並不是刪除了之後重新 push 上去就可以解決問題,其他人同樣可以通過 git reset 到你刪除之前直接查看這些。所以有必要將這些文件刪除。最大的威脅是隨着工程分支的增加,tag 的增加工程會越來越大,git clone 過程中會十之八九會中斷

查詢需要刪除的文件
step1:

檢索大文件索引

// 查詢一條記錄
git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -1
// 查詢十條記錄
git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10
step2:

根據索引查看大文件路徑

// 上面命令會返回一條或十條索引, 然後 grep 查找指定的索引
git rev-list  --objects --all | grep 75583cf808c3f73c78afc56bba98eec6feeadef3

前兩步示例
在這裏插入圖片描述

刪除文件
step1:

克隆項目,這裏這裏是使用 BFG 進行刪除的,所以需要克隆時添加 --mirror 參數。

git clone --mirror [email protected]:xichengliudui/test.git
step2:

刪除文件

java -jar bfg-1.13.0.jar --delete-files text.html test.git --no-blob-protection
java -jar bfg-1.13.0.jar --delete-folders target test.git --no-blob-protection
  • java -jar bfg-1.13.0.jar 命令
  • –delete-files 刪除文件
  • –delete-folders 刪除目錄
  • text.html 刪除所有 text.html 文件
  • target 刪除所有 target 目錄
  • –no-blob-protection 對分支取消保護(HEAD 所指向的),不然 HEAD 指向的分支不會進行刪除
cd test.git
step3:

git gc 清除一下

git reflog expire --expire=now --all && git gc --prune=now --aggressive
step4:

推送到遠程倉庫

git push

ref: https://rtyley.github.io/bfg-repo-cleaner/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章