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
posted @ 2022-04-20 18:40  makalo  阅读(1960)  评论(0编辑  收藏  举报