前言
git做為常用的工具,代碼倉庫中是會保存所有歷史記錄的。雖然,git的.gitignore文件里可以定義一些忽略的文件規則,但是,在提交代碼的時候,總會誤提交大文件,就會導致:就算我們把它刪了重新提交,.git文件夾依然會占用比較大的空間。
如何解決這個問題?
使用下面這個命令
#修改歷史提交記錄,把不需要的文件永久從歷史記錄中刪除
filter-branch
解決方法
先找出我們需要刪除的大文件
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
上面信息表示,最后一條就是最大的一條的記錄,d5849e68f5dd66eeb3c3ded6b27a3f4073e0a62d
是它的id
找出該記錄對應的文件
#git rev-list --objects --all | grep 記錄id
git rev-list --objects --all | grep d5849e68f5dd66eeb3c3ded6b27a3f4073e0a62d
將該文件從歷史記錄中移除
#git log --pretty=oneline --branches -- 文件路徑
git log --pretty=oneline --branches -- node_modules/electron/dist/electron.exe
重寫所有的commit,將該文件從git歷史中完全移除
#git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch 文件名' --tag-name-filter cat -- --all
git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch node_modules/electron/dist/electron.exe' --tag-name-filter cat -- --all
重寫完成
現在歷史記錄中已經沒有該文件了,不過運行filter-branch
產生的日志還有對該文件的引用,所以還需要運行下面的命令刪除
rm -Rf ./git/refs/original
rm -Rf ./git/logs/
git gc
git prune
此時,再看文件夾會發現變小了,現在就可以push代碼了,不過需要強制push
git push --force