1. 程式人生 > 其它 >git刪除歷史記錄中的大檔案詳解

git刪除歷史記錄中的大檔案詳解

前言

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