如何控制 Git 庫的膨脹? GC 一步搞定!
相信每個公司都有自己的官網。小明公司也不例外,不過小明卻發現公司的“猿”哥哥將許多視訊放在了程式碼倉庫裡,導致原本只有程式碼的倉庫從早期的幾十MB,飆升至 1G以上,變得無比臃腫(或者是慢慢臃腫)。這時老闆大手一揮刪了所有視訊,理論上是該縮小的,但小明發現倉庫大小沒有變化。明明刪了視訊,怎麼倉庫竟沒有變化?
到底發生了什麼導致 Git 庫的膨脹?
根據 Git 的資料儲存機制,只要通過命令 git add 將檔案儲存至暫存區,都會對版本庫中的每一個檔案,不論是圖片、視訊、原始檔還是二進位制檔案生成相對應的 Blob 物件(即一段二進位制資料)。
如果你的專案中不小心打包進來了比較大的 word 文件或視訊資源,Git 本身又識別不了該型別檔案,只能當作二進位制檔案全量儲存。所以,在其他人拉取該 word 文件更新完後再推遠端分支的時候,則會使得 .git 下面的 objects 的資料夾大小迅速膨脹。
上面使用場景中表面上少了500M空間,實則增加了一次至少500M的歷史提交記錄,倉庫容量沒有變化。
如何精簡你的 Git 倉庫?
第一種方案:壓縮 Git 倉庫。
例如,碼雲專案管理中會提供儲存庫 GC 功能,用於清理懸空檔案,壓縮儲存庫物件,減少儲存庫磁碟佔用。

第二種方案(推薦):刪除大檔案提交記錄。
檢視儲存庫中的大檔案:
git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`
改寫歷史,去除大檔案
git filter-branch --tree-filter 'rm -f path/to/large/files' --tag-name-filter cat -- --all git push origin --tags --force git push origin --all --force
並告知所有組員,push 程式碼前需要 pull rebase,而不是 merge,否則會從該組員的本地倉庫再次引入到遠端庫中。
更多碼雲企業版的特性請瀏覽: https://gitee.com/enterprises
往期精彩:
想要快速上手 Spring Boot ?看這些教程就足夠了!| 碼雲週刊第 81 期
