最近提交代碼時(shí),Gitee 把 push 攔下來了。
原因很直接:有個(gè)大文件超過限制,提示大概是 100MB 這一類。
我一開始以為很簡單:把文件刪掉,再提交一次。
結(jié)果還是失敗。
后來才反應(yīng)過來,Git 不是只看當(dāng)前目錄。這個(gè)大文件只要曾經(jīng)被 commit 過,即使后來刪了,它還在 Git 歷史里。Gitee 檢查到歷史對象里有超限文件,照樣拒絕。
嵌入式項(xiàng)目很容易踩這個(gè)坑。
固件包、bin、hex、elf、map、SDK 壓縮包、抓包日志、客戶現(xiàn)場日志,一次 git add . 就可能混進(jìn)去。
1
先判斷文件有沒有進(jìn)歷史
如果只是暫存,還沒提交:
git restore --staged path/to/big-file.bin然后加到 .gitignore:
build/output/*.bin*.hex*.elf*.map*.zip*.7z*.log*.pcap
如果已經(jīng) commit 過,就不是刪文件這么簡單了。

2
找出歷史里的大文件
Git Bash 可以用:
git rev-list --objects --all |git cat-file --batch-check="%(objecttype) %(objectname) %(objectsize) %(rest)" |grep "^blob" |sort -k3 -n |tail -20
PowerShell 可以用:
git rev-list --objects --all |git cat-file --batch-check="%(objecttype) %(objectname) %(objectsize) %(rest)" |Select-String "^blob" |Sort-Object { [int64](($_ -split "\\s+")[2]) } |Select-Object -Last 20
看見 build/xxx.elf、release/xxx.zip、xxx.bin 這類路徑,就基本知道問題在哪了。
3
只在最后一次提交里,直接改最后一次提交
如果大文件只在最后一次 commit 里:
git rm --cached path/to/big-file.bingit add .gitignoregit commit --amendgit push
--cached 表示只從 Git 里移除,本地文件還在。
4
已經(jīng)進(jìn)多次歷史,用 filter-repo 清掉
安裝:
pip install git-filter-repo清理指定文件:
git filter-repo --path path/to/big-file.bin --invert-paths清理整個(gè)構(gòu)建目錄:
git filter-repo --path build/ --invert-paths清理本地對象:
git gc --prune=now --aggressive推送:
git push --force-with-lease origin main如果是團(tuán)隊(duì)倉庫,先通知大家暫停提交。改寫歷史后,最好讓成員重新克隆,別各自亂 rebase。
5
大文件以后放哪里
不要把 Git 當(dāng)網(wǎng)盤。
bin/hex/elf | |
Git LFS 可以用,但不是萬能藥。
已經(jīng)進(jìn)普通 Git 歷史的大文件,不會因?yàn)槟銏?zhí)行 git lfs track 就自動消失。該清歷史還是要清。
