.git目录文件过大

摘要:
-郑宇的回答-知乎查找并删除Git记录中的大文件。ProGit首次使用Git的“核弹级选项”:过滤器分支

最近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

VtK1aQ.png

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

输出具体对象内容

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

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

VtKtx0.png

上述两个命令可以合并成一个
这样的输出效果更明显,方便
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}')"

VtKHzt.png

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

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

VtKOL8.png

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

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

VtMEeU.png

更行清理优化

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

VtMSij.png

这时候查看磁盘占用空间

du -d 1 -h

VtMiQ0.png

更新到远程仓库

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

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

VtMZo4.png

"真的update"

git push --force

VtMQQx.png

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

参考文章:
如何解决 GitHub 提交次数过多 .git 文件过大的问题? - 郑宇的回答 - 知乎

寻找并删除Git记录中的大文件
Pro Git
初次使用 git 的“核弹级选项”:filter-branch

免责声明:文章转载自《.git目录文件过大》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇dmalloc arm-linux平台使用Manjaro Samba 设置共享文件夹供Windows访问下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

向 Git 服务器添加 SSH 公钥

在网上很少找到文章有提到如何将自己的 Git 远程仓库配置成可以通过 SSH 公钥方式认证的,而几乎清一色都是告诉你怎么通过 web 界面向 GitHub 添加 SSH 公钥。LZ 在网上查找了一番,终于找到了办法。 对于不想看 LZ 下面罗嗦了一大堆的园友,LZ 先把结论放在这里,直接拿去用就是了。 把本地用户的 ~/.ssh/id_rsa.pub 的内...

linux简单命令与Shell脚本

说明1、#表示root用户登录,$表示普通用户登录2、|符号是管道符,用于把|前的输出作为后面命令的输入3、>表示追加并覆盖的意思4、>>两个大于符号,表示追加命令1、cd命令:切换目录cd /home 进入/home目录cd ../返回上一级目录cd  ./当前目录2、ls命令:产看文件及目录ls  ./ 查看当前目录所有的文件和目录l...

gcc 编译器参数

一、GCC编译过程 参考:http://hi.baidu.com/zengzhaonong/item/c00e079f500adccab625314f-------------------------------------    Pre-Processing   cpp        预处理    Compiling        ccl       ...

IDEA里面的facets和artifacts的讲解

Facets: Facets表述了在Module中使用的各种各样的框架、技术和语言。这些Facets让Intellij IDEA知道怎么对待module内容,并保证与相应的框架和语言保持一致。 使用Facets能让我们下载并配置framework所必须的组件,会自动生成各种各样的描述符,并存储在适当的位置,等等。 大多数Facets可以无冲突得添加到Mod...

用批处理文件删除n天前的文件

原文:http://blog.csdn.net/leehq/archive/2007/08/03/1723743.aspx 公司服务器用来备份数据的硬盘过段时间就会被备份文件占满,弄得我老是要登录到服务器去手工删除那些老的文件,有时忘记了就会导致硬盘空间不足而无法备份。 因为只要保留最近几天的备份,如果可以做一个批处理让系统自动删除老备份文件就好了,但是W...

小姐姐用动画图解Git命令,一看就懂!

无论是开发、运维,还是测试,大家都知道Git在日常工作中的地位。所以,也是大家的必学、必备技能之一。之前公众号也发过很多git相关的文章: Git这些高级用法,喜欢就拿去用!一文速查Git常用命令,搞定版本控制照做就ok大牛总结的Git使用技巧,写得太好了!掌握这10条规范,轻松搞定Git! 但是呢,民工哥,也经常在后台看到读者说,命令太多了不好记啊,时间...