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