最近clone一个仓库发现文件夹巨大,查看具体文件体积并不大
后来发现是.git目录占用过多空间

显示pack内容

Git 往磁盘保存对象时默认使用的格式叫松散对象 (loose object) 格式
Git 时不时地将这些对象打包至一个叫 packfile 的二进制文件以节省空间并提高效率
而git verify-pack 命令就是用于显示已打包的内容

git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -3

sort命令中 -k 指定排序参照列, -n 依照数值的大小排序
tail命令 指定输出项数

输出具体对象内容

git rev-list 按照默认反向时间顺序,输出命令指定的commit objects
--objects 列出的提交引用的任何对象的对象ID
--all 全部匹配结果

git rev-list --objects --all | grep b098d1c7

上述两个命令可以合并成一个
这样的输出效果更明显,方便
awk 命令是处理文本文件强大分析工具,{print$1} 表示每行按空格或TAB分割,输出文本中第一项

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

重写历史(此后内容极具危险)

git重写历史中,以前常用到的就是
修改上一次提交

git commit --amend

而我们这一次所需要用到的内容是,“核弹级选项” git filter-branch
它可以修改大量的提交

--force 拒绝从现有的临时目录开始,强制执行改写操作
--index-filter 与tree-filter相比,不检查树,和git rm搭配使用,更快的生成版本
--ignore-unmatch 如果你想“完全忘记”一个文件,在输入历史记录时无关紧要
--prune-empty 表示如果修改后的提交为空则扔掉不要。实际可能虽然文件被删除了,但是还剩下个空的提交
--tag-name-filter cat 来简单地更新标签
--all 是针对所有的分支,注意前面多了一个 -- 这个是为了让分隔开git filter-branch 和 --all

crnn/trained_models_crnn_Rec_done_155_1084.pth 为你要删除的文件名

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 'crnn/trained_models_crnn_Rec_done_155_1084.pth'"  --prune-empty --tag-name-filter cat -- --all

如果你想删除整个文件夹历史

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 'img/*'"  --prune-empty --tag-name-filter cat ----all

更行清理优化

git for-each-ref 输出指定位置所有reflog条目,--format 指定带有特定字符的Object
git update-ref update reflog条目
git reflog expire 删除掉--expire时间早的reflog条目
git gc --prune= 对指定日期之前的未被关联的松散对象进行清理

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

这时候查看磁盘占用空间

du -d 1 -h

更新到远程仓库

--verbose 详细输出运行log
--dry-run 做"真的update远程"以外所有工作

git push --force --verbose --dry-run

"真的update"

git push --force

最好的方法:不要把大文件放在git仓库

参考文章:
如何解决 GitHub 提交次数过多 .git 文件过大的问题? - 郑宇的回答 - 知乎
寻找并删除Git记录中的大文件
Pro Git
初次使用 git 的“核弹级选项”:filter-branch

转载于:https://www.cnblogs.com/bay1/p/10982254.html

.git目录文件过大相关推荐

  1. Git 之二 架构、工作流程、.git 目录文件

    写在前面   Git 的官网上有很详细的使用教程(当然有翻译版本),具体地址是 https://git-scm.com/book/zh/v2.唯一不足就是,很多讲解并没有实机演示.但是,毫无疑问,官网 ...

  2. Git 提交报错,账户和密码错误 和 git add/git commit 文件太大太多

    问题1: Git 提交报错,账户和密码错误 重新使用git进行作业提交 问题2: 源码太大文件太多,失败 git add . git commit idea push操作 问题3:git push 报 ...

  3. git pack文件过大

    作者:Intopass 链接:https://www.zhihu.com/question/29769130/answer/45546231 来源:知乎 一:常规办法 1.删除无用的分支 gitbra ...

  4. 解决 .git 目录过大问题

    点击下方"IT牧场",选择"设为星标" 来源:www.escapelife.site/posts/b400b7f8.html 01.问题描述 02.原因解释 0 ...

  5. Git清理过大的git目录objects文件

    Git清理过大的git目录objects文件 Git清理过大的git目录objects文件 1. git rev-list --objects --all | grep "$(git ver ...

  6. git push 推送大文件失败的处理办法

    不小心把数据库备份文件放到git目录里了,导致无法上传代码. 首先参考了 这篇文章 http://www.cnblogs.com/qmmq/p/4604862.html. 按照文中一开始说的去做,可还 ...

  7. git无法上传大文件

    环境先描述一下,公司办公网自己在centos上搭建了gitlab,同时办公网的域名是从ST环境通过nginx解析过来的,这样一样就是文件经过两个nginx,按照网上的文章修改了两个nginx配置文件里 ...

  8. Git提交单个文件过大,git error: remote unpack failed:error Object too large

    Table of Contents 一. 上传git出错 二. git基本概念 三. 解决 参考链接 一. 上传git出错 error: remote unpack failed: error Obj ...

  9. git 文件太大,清空历史commit

    文章目录 提交历史太多之后会造成 .git object 文件体积过大 进行删除并强制提交 git checkout --orphan latest_branch git add -A git com ...

最新文章

  1. 4.10日一直报错application未注入的问题解决
  2. 来宾可以删除服务器文件怎么设置密码,服务器来宾用用户设置密码
  3. sqlplus怎样将名次显示在表的后面_一分一段表怎么用?2019年辽宁高考一分一段表...
  4. python struct pack解析_python struct pack
  5. 《Android开发从零开始》——25.数据存储(4)
  6. windows。forms.timer设置第一次不等待_适用于初学者的中线交易策略——金叉的三种设置条件...
  7. SpringMVC中使用@ResponseBody注解标注业务方法
  8. Java CAS无锁技术深度解析
  9. tablepc是什么平板电脑_tablepc平板电脑怎么截图
  10. 基于MVC4+EasyUI的Web开发框架经验总结(5)--使用HTML编辑控件CKEditor和CKFinder
  11. 【机器学习基础】正规方程法(Normal equation)(正则化和非正则化)——吴恩达课程笔记
  12. 多重中介效应的示例数据(内附STATA代码)
  13. 常见的web网站攻击类型
  14. C语言笑谈:C语言超级搞笑的代码,冷笑话我们程序员也会讲的啊!
  15. IT大学生成长周报 | 第 8 期
  16. 赵小楼《天道》《遥远的救世主》深度解析(45)肖亚文为什么最后能成为最大的受益者?
  17. Power BI中计算同比、环比
  18. MYSQL中,in、limt、升降序、count的用法
  19. 如何一步步打造完美的成绩查询系统平台?
  20. 【实例学模式】一针见血装饰器模式

热门文章

  1. python paramiko并发_Python之paramiko
  2. android中seekbar 常用属性列表,随笔–android中修改SeekBar控件默认显示-Fun言
  3. linux系统如何禁用网卡,Linux 中如何启用和禁用网卡?
  4. linux关机_3.5 开关机命令及7个运行级别《LINUX-centos7-操作系统入门到精通》
  5. php只获取来源域名不需要参数,在php中获取域名(不是子域)
  6. netty半包粘包 处理_老王:Netty到底是个什么鬼?有没有简单的理解方式?
  7. php ==gt;,谈谈PHP中的 -gt;、=gt; 和 :: 符号 - 易采站长站
  8. psql屏幕输出全部结果_CommandBuffer实现Distort屏幕扭曲效果
  9. 只有ajax会跨域吗_为什么跨域Ajax是安全问题?
  10. html5技术英文论文参考文献,英文论文的参考文献范例(精选8篇)