你可以从别人那里汲取某些思想,但必须用你自己的方式加以思考|

makalo

园龄:5年10个月粉丝:144关注:15

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

本文作者:makalo

本文链接:https://www.cnblogs.com/makalochen/p/16171201.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   makalo  阅读(2298)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
历史上的今天:
2020-04-20 linux 脚本运行的几种方式
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起