爲什麼倉庫會越來越大?¶
你有沒有遇到過這樣的情況:克隆一個Git倉庫時,網速明明很快,但就是卡在“Receiving objects”這一步?或者每次提交代碼都要等半天,因爲倉庫裏藏着一些“巨無霸”文件?其實,Git倉庫變大通常是因爲這些原因:
- 不小心提交了大文件:比如日誌文件、安裝包、視頻/音頻等二進制文件,或者開發工具生成的臨時大文件。
- 歷史記錄裏的“陳年舊物”:有些大文件可能被多次提交到歷史記錄裏,即使刪除了本地的大文件,歷史版本裏的“幽靈”文件依然佔用空間。
- 子模塊(Submodule)未優化:如果項目用了Git子模塊,而子模塊本身體積很大,也會導致整個倉庫“虛胖”。
倉庫太大的麻煩¶
- 克隆/下載慢:別人克隆時要下載幾十GB的歷史數據,團隊協作效率低。
- 備份和傳輸費時間:每次備份倉庫都要傳大文件,佔用存儲空間。
- 本地操作卡頓:Git操作(比如
git log、git diff)會變慢,編輯器打開項目也會很卡。
一、先“斬草除根”:清理當前提交的大文件¶
如果最近一次提交剛把大文件加進去,還沒推到遠程倉庫,直接刪掉就好!
場景1:剛提交了大文件,還沒推到遠程¶
步驟:
1. 確認大文件:用git status看看剛提交的文件,或者用ls -lh 文件名查看文件大小(比如ls -lh mybigfile.zip)。
2. 刪除緩存區的大文件:假設大文件叫mybigfile.zip,執行:
git rm --cached mybigfile.zip # 只從Git緩存區刪除,保留本地文件
- 重新提交:把修改後的內容提交:
git commit -m "刪除大文件mybigfile.zip"
- 推送更新:因爲本地已經刪掉了大文件,遠程倉庫還沒變,直接推:
git push
場景2:想刪除歷史中某一次提交裏的大文件¶
如果大文件已經被多次提交到歷史裏(比如之前的5次提交都有這個大文件),需要清理歷史記錄。
二、“重寫歷史”:刪除歷史中的大文件¶
這裏要用到一個工具:git filter-repo(比老工具git filter-branch更快、更安全,推薦用它)。
第一步:安裝git filter-repo¶
- Mac:用Homebrew安裝:
brew install git-filter-repo
- Linux:用包管理器(Debian/Ubuntu):
sudo apt-get install git-filter-repo
- Windows:推薦用WSL(Windows Subsystem for Linux)或Chocolatey安裝:
choco install git-filter-repo # 需要先裝Chocolatey
第二步:刪除歷史中的大文件¶
假設大文件是mybigfile.zip,且它出現在所有歷史提交中,執行:
# 進入倉庫根目錄,執行命令(替換路徑和文件名)
git filter-repo --path mybigfile.zip
這條命令會遍歷所有提交,把包含mybigfile.zip的文件從歷史記錄中徹底刪除。
第三步:驗證修改¶
執行git log --oneline查看歷史提交,確認大文件已經消失。再用du -sh .git查看倉庫大小,應該明顯變小了。
第四步:推送到遠程倉庫¶
注意!本地修改了歷史記錄,遠程倉庫的歷史沒變,所以需要強制推送:
git push --force-with-lease origin main # 把main分支的歷史推到遠程(origin是遠程倉庫名)
⚠️ 警告:--force會覆蓋遠程倉庫的歷史,一定要確認團隊成員沒有基於舊歷史工作!如果是多人協作,最好先溝通,或者在自己的個人倉庫操作。
三、終極方案:清理所有大文件(包括子模塊)¶
如果倉庫裏有多個大文件,或者想批量清理,可以用git filter-repo的--path-glob參數匹配多個文件,比如刪除所有.log文件:
git filter-repo --path-glob "*.log" --invert-paths # --invert-paths表示刪除匹配的文件
如果倉庫用了Git子模塊,子模塊本身可能是個大文件,要先把子模塊的大文件也清理掉,再git submodule update --init重新拉取。
四、避坑指南:操作前必看¶
- 備份倉庫:操作前複製一份倉庫到其他地方,防止意外。
- 別在多人分支用
--force:如果是團隊協作,--force會讓別人的本地倉庫出現衝突,最好等所有人確認後再執行。 - 檢查是否漏刪:清理後用
git rev-list --objects --all | sort -k2n | tail -10列出最大的10個文件,看看是否還有遺漏。 - 別用
git rm -rf刪工作區:git rm -rf會刪除本地文件,而--cached只刪緩存不刪本地,更安全。
五、長期優化:用Git LFS管理大文件¶
如果項目必須提交大文件(比如視頻、模型文件),別直接提交到Git!用Git LFS(Large File Storage) 替代:
1. 安裝LFS:git lfs install
2. 跟蹤大文件:git lfs track "*.zip"(跟蹤所有.zip文件)
3. 提交.gitattributes文件:git add .gitattributes
4. 後續提交大文件會自動用LFS存儲,節省倉庫空間。
總結¶
清理Git倉庫的核心思路是:刪除無用大文件 + 重寫歷史記錄。關鍵工具是git filter-repo,操作時記得備份和溝通。如果項目裏有大文件,優先用Git LFS管理,從源頭減少倉庫體積!定期檢查倉庫大小,養成“小文件提交,大文件用LFS”的習慣,團隊協作會更順暢~