Git 倉庫隨時間增長,會積累大文件、敏感信息、廢棄分支等無效對象,導致克隆緩慢、磁盤佔用大。本文對比 git filter-branch、git filter-repo、BFG Repo-Cleaner 三種清理方案,推薦 BFG 多線程高性能清理大型倉庫。

.git/objects 目錄佔用數 GB,包含歷史誤提交的 .zip、.log、node_modules、*.out 等。# 1. 備份倉庫
git clone --mirror git@github.com:org/repo.git
cd repo.git
# 2. 刪除歷史中所有名為 nohup.out 的文件
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch **/nohup.out' \
--prune-empty --tag-name-filter cat -- --all
# 3. 清理引用、垃圾回收
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now --aggressive
# 4. 強制推送(需團隊協調)
git push --force --all
git push --force --tags
缺點:單線程、處理 2GB 倉庫需數小時、路徑匹配不精確(同名文件誤刪/漏刪)、官方已標記為不推薦。
# 安裝
pip install git-filter-repo
# 刪除所有 .zip .log .out 文件
git filter-repo --path-glob '*.zip' --path-glob '*.log' --path-glob '*.out' --invert-paths
# 刪除大於 1MB 的 blob
git filter-repo --strip-blobs-bigger-than 1M
# 強制推送
git push --force --all
git push --force --tags
優點:多線程、路徑匹配精確、支持複雜重寫邏輯。缺點:需 Python 環境、學習曲線稍陡。
# 下載 jar 包
wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar
# 或包管理器
# apt install bfg
# brew install bfg
# 1. 裸克隆
git clone --mirror git@github.com:org/repo.git
cd repo.git
# 2. 刪除歷史中所有 .zip 文件
java -jar bfg-1.14.0.jar --delete-files '*.zip' repo.git
# 3. 刪除所有 .log 文件
java -jar bfg-1.14.0.jar --delete-files '*.log' repo.git
# 4. 刪除所有 .out 文件
java -jar bfg-1.14.0.jar --delete-files '*.out' repo.git
# 5. 刪除所有大於 1MB 的 blob
java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 1M repo.git
# 6. 清理並壓縮
git reflog expire --expire=now --all
git gc --prune=now --aggressive
# 7. 強制推送
git push --force --all
git push --force --tags
git clone git@github.com:org/repo.git。git fetch --all
git reset --hard origin/main
git clean -fd
| 場景 | 命令 |
|---|---|
| 裸克隆(鏡像) | git clone --bare /path/to/repo |
| 修改最後一次提交 (amend) | git add . && git commit --amend && git push -f |
| 放棄本地未提交修改 | git checkout . 或 git restore . |
| 撤銷最後一次提交 (保留修改) | git reset --soft HEAD^ |
| 銷毀最後一次提交 (丟棄修改) | git reset --hard HEAD^ && git push -f |
| 嵌入版本號到構建產物 | git rev-parse HEAD > version.txt |
| 查找大文件 | git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {print $3, $4}' | sort -rn | head -20 |
.gitignore 覆蓋 *.log、*.zip、node_modules/、target/、.idea/、*.pem。pre-commit 檢測大文件(>1MB)、敏感信息(gitleaks、truffleHog)。選對工具(BFG)、建立規範、定期清理,讓 Git 倉庫保持輕量、安全、高效,是工程化團隊的基本功。
Linux 雙伺服器 IP 無縫切換實戰:ifconfig 別名介面 + arping 免費 ARP 宣告秒級遷移
Linux Shell 腳本輸出文字顏色設定技巧:自訂函式讓訊息一目瞭然
Android Dalvik 堆內存管理與 GC 機制:Zygote 分叉、COW 雙堆架構、標記清除演算法細節
Linux rename 指令批次重命名完全攻略:C 語言版 vs Perl 版差異詳解
Linux 區別 gmtime 與 localtime 函數用法(含 C 程式範例與執行結果)
Ubuntu 軟體中心提示 Lists 錯誤?一鍵修復指令教學