git刪除歷史記錄中的大文件詳解


前言

git做為常用的工具,代碼倉庫中是會保存所有歷史記錄的。雖然,git.gitignore文件里可以定義一些忽略的文件規則,但是,在提交代碼的時候,總會誤提交大文件,就會導致:就算我們把它刪了重新提交,.git文件夾依然會占用比較大的空間。

如何解決這個問題?

使用下面這個命令

#修改歷史提交記錄,把不需要的文件永久從歷史記錄中刪除
filter-branch

解決方法

先找出我們需要刪除的大文件

git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5

image-20220420175839529

上面信息表示,最后一條就是最大的一條的記錄,d5849e68f5dd66eeb3c3ded6b27a3f4073e0a62d是它的id

找出該記錄對應的文件

#git rev-list --objects --all | grep 記錄id
git rev-list --objects --all | grep d5849e68f5dd66eeb3c3ded6b27a3f4073e0a62d

image-20220420180535680

將該文件從歷史記錄中移除

#git log --pretty=oneline --branches -- 文件路徑
git log --pretty=oneline --branches -- node_modules/electron/dist/electron.exe

image-20220420181103313

重寫所有的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

image-20220420183057120

重寫完成

現在歷史記錄中已經沒有該文件了,不過運行filter-branch產生的日志還有對該文件的引用,所以還需要運行下面的命令刪除

rm -Rf ./git/refs/original
rm -Rf ./git/logs/
git gc
git prune

此時,再看文件夾會發現變小了,現在就可以push代碼了,不過需要強制push

git push --force


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM