Git彻底删除历史记录中大文件
在使用Git时偶尔会有小伙伴提交一些错误的大文件到版本控制,等到发现用git rm
删除掉那个文件。但这样做是不够的,这些文件之后并没有真正在项目中被用到,与此同时这些大文件的存在会导致整个 git 仓库的容量暴增,影响每次 clone 和 fork 代码仓库的时间。文件还一直存在历史log中,需要重写历史后执行清理后才能彻底清除。
- git verify-pack 命令查看 pack 文件包的相关详细信息,通过文件大小进行排序,这里只列出5个最大的文件。
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
output
988821841808f2a04123b4a16c88912bb04e3cfa blob 31157 14012 747972
2c958c8b8521738c76269812c280b20a08b7b0fc blob 31170 8443 306412
9108ebc4238d195101622febd15ecafc93ccc18e blob 31714 14196 728479
2d842e61422a013354e7865f946dad1058bce5a1 blob 32110 14395 575722
777e8697e5dc1017ca901c8cf226d707b6e96b06 blob 62678 22645 248106
- git rev-list 列出该对象文件名等更多信息
git rev-list --objects --all | grep 777e8697e5dc1017ca901c8cf226d707b6e96b06
output
777e8697e5dc1017ca901c8cf226d707b6e96b06 go.sum
以上两步可以全并成一条命令,方便快速查询。
git rev-list --objects --all |grep $(git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -1|awk '{print $1}')
在日志中查找这个文件
git log --pretty=oneline --branches -- go.sum
filter-branch 修改提交历史的命令
–tree-filter表示修改文件列表。
–msg-filter表示修改提交信息,原提交信息从标准输入读入,新提交信息输出到标准输出。
–prune-empty表示如果修改后的提交为空则扔掉不要。在一次试运行中我发现虽然文件被删除了,但是还剩下个空的提交,就查了下 man 文档,找到了这个选项。
-f是忽略备份。不加这个选项第二次运行这个命令时会出错,意思是 git 上次做了备份,现在再要运行的话得处理掉上次的备份。
–all是针对所有的分支。
git filter-branch --index-filter 'git rm --cached --ignore-unmatch go.sum' -- --all
到这里,历史记录中已经没有该文件了。不过运行 filter-branch 产生的日志还是会对该文件有引用,所以还需要运行以下几条命令,把该文件的引用完全删除:
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
git prune
查看.git目录,已经小了很多了
du -sh .git
强制 push
git push --force
需要注意把涉及重写后的分支全部强制推送到远程共享库。同步提醒其他小伙伴重新clone 代码仓库,否则其他人提交就前功尽弃了。
云效代码仓库删除大文件
官网git-filter-branch
filter-branch 常用功能
修改提交用户名
git filter-branch -f --env-filter "GIT_AUTHOR_NAME=xxx" -- --all
修改提交邮箱
git filter-branch -f --env-filter "GIT_AUTHOR_EMAIL=xxx@xxx.com" -- --all
Git彻底删除历史记录中大文件相关推荐
- Git永久删除历史文件(包含历史记录)
有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的),而且上传的文件又特别大的时候, 这将导致别人clone你的代码或下载zip包的时候也必须 ...
- 查找在Git中删除文件的时间
本文翻译自:Find when a file was deleted in Git I have a Git repository with n commits. 我有一个带有n次提交的Git存储库. ...
- linux git 撤销删除文件,删除文件以后,如何通过git撤销删除的文件,不提交到远端代码库...
检查状态,看看发生了什么: $ git status On branch master Changed but not updated: (use "git add/rm ..." ...
- 删除git commit 的 UserInterfaceState.xcuserstate 文件
为什么80%的码农都做不了架构师?>>> 1.首先找到UserInterfaceState.xcuserstate文件的路径: 1.打开项目,找到"项目名.xcwor ...
- git ignore 怎么添加和删除_Git删除已追踪文件,上传大文件到Github
新手使用git的时候经常会出现把ide配置文件.编译生成文件.模型文件等提交的仓库中,导致频繁的更新.并且已经提交过的文件即使在.gitignore文件中进行了配置git还是会进行追踪.那么我们应该如 ...
- git手动删除的文件 pul不下来了_Git工作总结
Git总结 一.基本知识 1.初识Git git简介:git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目: git与svn: git 是分布式的(每部电脑都有着自己的版本库) ...
- Git 彻底删除大文件
Git 彻底删除大文件 Tags: <git> pyecharts 的 git history 中存在着很多以前文档需要的图片,导致 pyecharts 整个 git 仓库体积达到 90M ...
- git 批量删除文件夹和文件
git 批量删除文件夹和文件 本地删除文件后,执行 $ git status 然后接着 $ git rm <文件> 此时如果是要删除大批量文件,这么一个一个命令下去不得累死人啊 其实可以这 ...
- git之删除仓库文件
上传错文件的现象很正常 可能直接使用git add .方便,但也可能传入了一些不想传入的东西 简单的介绍一下删除仓库的文件 上图是我上传错的文件(真的是图add .方便) git rm -r --ca ...
最新文章
- 藏在标定板身后的秘密
- android+apk反编译+Mac
- SQL Server2005设置sa登录名
- android如何导入活动,关于android:如何将活动值传递给另一个活动(Kotlin)
- 支付时报错java.lang.RuntimeException: 【微信统一支付】发起支付, returnCode != SUCCESS, returnMsg = appid和mch_id不匹配
- mongodb默认的用户名密码_Windows下MongoDB设置用户、密码
- python元类_Python中元类
- 2022年的文章写作计划
- 华为[ENSP]OSPF的配置实例(单区域+多区域)
- 如何用vm虚拟机当服务器,vm虚拟机如何做云服务器
- 用华为手机拍照!要学会这4个功能,随手一拍都是单反大片
- socket.io实现聊天功能——第一章 、群聊
- 详解spring用到的九种设计模式
- SQL Server的密码忘了怎么设置新密码
- GPS理论知识NMEA 0813协议
- 什么是面向对象编程?终于懂了
- Python从入门到实践:7-5电影票循环的四种写法,动手试一试
- Revit二次开发—获取并修改指定标高
- 利用系统方法分析COBIT5解决问题的原理
- 毕业设计-图书管理系统