以下操作很危險(xiǎn)梯醒,操作前請(qǐng)確定你清楚你在執(zhí)行什么操作户辱,請(qǐng)做好必要的備份
??拉取分支代碼
git clone 你的遠(yuǎn)程分支地址
git checkout master
??刪除要干掉的大文件
git rm --cached -rf res/
rm -rf res/
??提交修改
git commit -m '刪除無(wú)用文件'
??清理空間烫幕,并打包成pack
git gc
??查看size-pack的大心旱摹(實(shí)際并沒有減少,clone時(shí)還會(huì)出現(xiàn))
git count-objects -v
??查看.git/objects/pack/文件夾中最新的idx文件
pack-8ec65b4812ef28bda4ae012f9ebae1bc793f7ad6.idx
??找出最大的文件(按第3列進(jìn)行排序感挥,取最后10個(gè)大文件)
git verify-pack -v .git/objects/pack/pack-8ec65b4812ef28bda4ae012f9ebae1bc793f7ad6.idx | sort -k 3 -n | tail -10
??確定這個(gè)文件是什么文件(不要誤刪了其他文件)
git rev-list --objects --all | grep 1d308d156e
??確定哪次提交引入的(找最底下的提交就行了)
git log --oneline --branches -- res/JPG_5667.jpg
??重寫從引入提交開始往后的所有提交
git filter-branch --index-filter 'git rm --ignore-unmatch --cached res/JPG_5667.jpg' -- 05567b1^..
??我們要?jiǎng)h除的是一批大文件
git log --oneline --branches -- res/*
??當(dāng)之前的重寫不對(duì)時(shí)缩搅,-f 強(qiáng)制覆蓋之前的重寫
git filter-branch -f --index-filter 'git rm --ignore-unmatch --cached res/*' -- f9fbf6c^..
??重寫完成,刪除引用信息
rm -Rf .git/refs/original
git reflog expire --expire=now --all
??重新打包
git gc --aggressive --prune=now
??查看本地的size-pack是否減小了(實(shí)踐證明触幼,本地是沒有減小的)
git count-objects -v
??最后勇敢的把本地的危險(xiǎn)操作推送到遠(yuǎn)程分支(最好自己本地做個(gè)備份吧硼瓣,到時(shí)回不了頭就不好了)
git push origin master --force
上一步你可能遇到master是個(gè)保護(hù)分支,那么取消保護(hù)吧(操作完要保護(hù)回來(lái)哦)
??刪掉本地代碼置谦,重寫clone遠(yuǎn)程分支
??再次查看size-pack的大刑美稹(其實(shí)你在clone的時(shí)候已經(jīng)感受到大文件已經(jīng)沒有了)
git count-objects -v