【经验分享】git项目.git/objects/pack很大,clone很久,object文件清理

2023-12-12 17:37

本文主要是介绍【经验分享】git项目.git/objects/pack很大,clone很久,object文件清理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

问题现象:

解决办法:

目前实践方法2,步骤如下:

1.识别出最大的三个文件

2.查询大文件的文件名称:

3.将文件从tree中移除

4.清理和回收空间

5.提交修改远程仓库


问题现象:

gitlab项目12G,但实际项目就几百兆,后本地排查,发现pack文件过大,特此记录一下,object文件清理问题。

找了一下原因,.git/objects/pack 文件过大,可能是由于开发过程中上传过大文件,虽然现已删除,但仍然保存着git记录中。

就比如每次npm run build生成dist,需要打包到服务器,这个可能就上传到记录中了。

git项目越来越大的原因:

git add 和 git commit 的过程中,保存修改了的文件的 blob,更新索引,创建 tree 对象,最后创建 commit 对象,这些 commit 对象指向了顶层 tree 对象以及先前的 commit 对象。这三类 Git 对象 ── blobtree 以及 commit ── 都各自以文件的方式保存在 .git/objects 目录下。

所以,当你提交了一个体积特别大的文件后,会记录在 objects 文件夹下,删除一个文件,只是记录了删除这个操作,但并不会把文件从 .git 文件夹删除。 当你直接从项目中删除该文件,.git 文件夹完全不会变小(理论上还会变大一点,因为多记录了一次删除操作。。。)

解决办法:

1.新建一个只有master分支的当前版本的新项目,原项目做备份或删除;

2.彻底删除历史记录,清理object文件大小。

补充一点, 如果你想以后也不会再上传这个文件或文件夹, 请把这个文件或文件夹添加到.gitignore文件里, 然后再push你的项目

目前实践方法2,步骤如下:

1.识别出最大的三个文件

进入项目根目录,在git bash 中执行

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

命令解析:

verify-pack 命令用于显示已打包的内容,我们用它来找到那些大文件。

-v(verbose)参数是打印详细信息。

–objects:列出该提交涉及的所有文件ID

执行结果:

f4bcfa14220885922ca311a9b97ab6a087269057 blob   1194049978 1193418168 7030313773
9e91faabd113ac69a6534c50a8dc3718f556b20c blob   1237993230 1237347387 10317735659
c7d414a597a838e9174fc68ae4fbe78aa8084b91 blob   1237993230 1237347335 9080388324

2.查询大文件的文件名称:

执行命令:

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

命令解析:

rev-list 命令用来列出Git仓库中的提交,我们用它来列出所有提交中涉及的文件名及其ID。 该命令可以指定只显示某个引用(或分支)的上下游的提交

–objects:列出该提交涉及的所有文件ID

–all:所有分支的提交,相当于指定了位于 /refs 下的所有引用

执行结果:

f4bcfa14220885922ca311a9b97ab6a087269057 dist-aidmav3.1.5-2020091502.zip

3.将文件从tree中移除

执行命令:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch  dist-aidmav3.1.5-2020091502.zip'

命令解析:

filter-branch命令可以用来重写Git仓库中的提交。

–index-filter参数用来指定一条Bash命令,然后Git会检出(checkout)所有的提交, 执行该命令,然后重新提交。

4.清理和回收空间

虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间.

执行命令:

$ rm -rf .git/refs/original/$ git reflog expire --expire=now --all$ git gc --prune=now# Counting objects: 2437, done.
# Delta compression using up to 4 threads.
# Compressing objects: 100% (1378/1378), done.
# Writing objects: 100% (2437/2437), done.
# Total 2437 (delta 1461), reused 1802 (delta 1048)$ git gc --aggressive --prune=now# Counting objects: 2437, done.
# Delta compression using up to 4 threads.
# Compressing objects: 100% (2426/2426), done.
# Writing objects: 100% (2437/2437), done.
# Total 2437 (delta 1483), reused 0 (delta 0)

命令解析:

git-reflog 管理reflog信息

--expire=<time> 剪除比指定时间更早的条目。如果未指定此选项,则从配置设置中获取到期时间,而配置设置gc.reflogExpire又默认为90天。--expire=all不论年龄大小,都能修剪; --expire=never关闭修剪可及条目。

expire 命令修剪旧的reflog条目

--all  处理所有引用的reflog

git gc 清理不必要的文件并优化本地存储库

--aggressive  通常git gc运行速度很快,同时提供良好的磁盘空间利用率和性能 此选项将导致git gc更积极地优化存储库,但花费更多时间。这种优化的效果是持久的,所以这个选项只需要偶尔使用。

--prune=<date> 修剪比日期更旧的松散对象(默认为2周前,可由配置变量覆盖gc.pruneExpire)。--prune =不管年龄大小,都修剪松散的物体,并且如果另一个进程同时写入存储库,则会增加腐败风险; 请参阅下面的“注意事项”。--prune默认打开

详细学习《git gc》《git reflog》

现在你再看看你的.git目录文件大小是不是变小了。

5.提交修改远程仓库

执行命令:

git push origin master --forcegit remote prune origin

参考学习:

git目录下object文件过大清理_git object 特别大-CSDN博客

彻底删除git中的大文件 - 简书

https://www.cnblogs.com/shines77/p/3460274.html

最后

如果说

友友们之间的点赞

展现的是相互之间的支持,善意和友情

那么

你对我文章的认真阅读

则是对我的劳动成果的

默默地承认和支持

每一次创文的过程

都是我锻炼自己逻辑思维能力和语言组织能力的过程

也是我

不断深悟生活,思考人生的过程

每一篇文章的形成

都是我心血的结晶

能有幸被你阅读

欢迎点赞,评论,互关!~~

这篇关于【经验分享】git项目.git/objects/pack很大,clone很久,object文件清理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/485421

相关文章

Python中常用的四种取整方式分享

《Python中常用的四种取整方式分享》在数据处理和数值计算中,取整操作是非常常见的需求,Python提供了多种取整方式,本文为大家整理了四种常用的方法,希望对大家有所帮助... 目录引言向零取整(Truncate)向下取整(Floor)向上取整(Ceil)四舍五入(Round)四种取整方式的对比综合示例应

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试