git刪除歷史記錄中的大檔案詳解
阿新 • • 發佈:2022-04-20
前言
git做為常用的工具,程式碼倉庫中是會儲存所有歷史記錄的。雖然,git的.gitignore檔案裡可以定義一些忽略的檔案規則,但是,在提交程式碼的時候,總會誤提交大檔案,就會導致:就算我們把它刪了重新提交,.git資料夾依然會佔用比較大的空間。
如何解決這個問題?
使用下面這個命令
#修改歷史提交記錄,把不需要的檔案永久從歷史記錄中刪除
filter-branch
解決方法
先找出我們需要刪除的大檔案
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
上面資訊表示,最後一條就是最大的一條的記錄,d5849e68f5dd66eeb3c3ded6b27a3f4073e0a62d
找出該記錄對應的檔案
#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