在使用Git时偶尔会有小伙伴提交一些错误的大文件到版本控制,等到发现用git rm
删除掉那个文件。但这样做是不够的,这些文件之后并没有真正在项目中被用到,与此同时这些大文件的存在会导致整个 git 仓库的容量暴增,影响每次 clone 和 fork 代码仓库的时间。文件还一直存在历史log中,需要重写历史后执行清理后才能彻底清除。

  1. 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
  1. 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彻底删除历史记录中大文件相关推荐

  1. Git永久删除历史文件(包含历史记录)

    有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的),而且上传的文件又特别大的时候, 这将导致别人clone你的代码或下载zip包的时候也必须 ...

  2. 查找在Git中删除文件的时间

    本文翻译自:Find when a file was deleted in Git I have a Git repository with n commits. 我有一个带有n次提交的Git存储库. ...

  3. linux git 撤销删除文件,删除文件以后,如何通过git撤销删除的文件,不提交到远端代码库...

    检查状态,看看发生了什么: $ git status On branch master Changed but not updated: (use "git add/rm ..." ...

  4. 删除git commit 的 UserInterfaceState.xcuserstate 文件

    为什么80%的码农都做不了架构师?>>>    1.首先找到UserInterfaceState.xcuserstate文件的路径: 1.打开项目,找到"项目名.xcwor ...

  5. git ignore 怎么添加和删除_Git删除已追踪文件,上传大文件到Github

    新手使用git的时候经常会出现把ide配置文件.编译生成文件.模型文件等提交的仓库中,导致频繁的更新.并且已经提交过的文件即使在.gitignore文件中进行了配置git还是会进行追踪.那么我们应该如 ...

  6. git手动删除的文件 pul不下来了_Git工作总结

    Git总结 一.基本知识 1.初识Git git简介:git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目: git与svn: git 是分布式的(每部电脑都有着自己的版本库) ...

  7. Git 彻底删除大文件

    Git 彻底删除大文件 Tags: <git> pyecharts 的 git history 中存在着很多以前文档需要的图片,导致 pyecharts 整个 git 仓库体积达到 90M ...

  8. git 批量删除文件夹和文件

    git 批量删除文件夹和文件 本地删除文件后,执行 $ git status 然后接着 $ git rm <文件> 此时如果是要删除大批量文件,这么一个一个命令下去不得累死人啊 其实可以这 ...

  9. git之删除仓库文件

    上传错文件的现象很正常 可能直接使用git add .方便,但也可能传入了一些不想传入的东西 简单的介绍一下删除仓库的文件 上图是我上传错的文件(真的是图add .方便) git rm -r --ca ...

最新文章

  1. 藏在标定板身后的秘密
  2. android+apk反编译+Mac
  3. SQL Server2005设置sa登录名
  4. android如何导入活动,关于android:如何将活动值传递给另一个活动(Kotlin)
  5. 支付时报错java.lang.RuntimeException: 【微信统一支付】发起支付, returnCode != SUCCESS, returnMsg = appid和mch_id不匹配
  6. mongodb默认的用户名密码_Windows下MongoDB设置用户、密码
  7. python元类_Python中元类
  8. 2022年的文章写作计划
  9. 华为[ENSP]OSPF的配置实例(单区域+多区域)
  10. 如何用vm虚拟机当服务器,vm虚拟机如何做云服务器
  11. 用华为手机拍照!要学会这4个功能,随手一拍都是单反大片
  12. socket.io实现聊天功能——第一章 、群聊
  13. 详解spring用到的九种设计模式
  14. SQL Server的密码忘了怎么设置新密码
  15. GPS理论知识NMEA 0813协议
  16. 什么是面向对象编程?终于懂了
  17. Python从入门到实践:7-5电影票循环的四种写法,动手试一试
  18. Revit二次开发—获取并修改指定标高
  19. 利用系统方法分析COBIT5解决问题的原理
  20. 毕业设计-图书管理系统

热门文章

  1. Kaggle竞赛——Titanic泰坦尼克之灾(保姆级基础版)
  2. 快速搭建基于beanstalk的php消息队列服务
  3. python按任意键退出_Python实现按任意键继续/退出的功能
  4. CAD下载完成之后想更大限度提高效率?这七个工具组合大有用处
  5. Ruby_11_多线程と包管理
  6. css3制作炫酷动画相册
  7. Weibull Distribution韦布尔分布的深入详述(3)分析案例建模实践
  8. 内外边界 区分 与 例子
  9. JToken和JObject有什么区别
  10. JObject ToObject报错