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

这篇具有很好参考价值的文章主要介绍了【经验分享】git项目.git/objects/pack很大,clone很久,object文件清理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

问题现象:

解决办法:

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

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

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

3.将文件从tree中移除

4.清理和回收空间

5.提交修改远程仓库


问题现象:

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

git gc 后更大,git,git

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

git gc 后更大,git,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

git gc 后更大,git,git

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

执行命令:

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

命令解析:

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

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

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

执行结果:

f4bcfa14220885922ca311a9b97ab6a087269057 dist-aidmav3.1.5-2020091502.zip

git gc 后更大,git,git

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 --force

git remote prune origin

参考学习:

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

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

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

最后

如果说

友友们之间的点赞

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

那么

你对我文章的认真阅读

则是对我的劳动成果的

默默地承认和支持

每一次创文的过程

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

也是我

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

每一篇文章的形成

都是我心血的结晶

能有幸被你阅读文章来源地址https://www.toymoban.com/news/detail-772834.html

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

到了这里,关于【经验分享】git项目.git/objects/pack很大,clone很久,object文件清理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Git clone fetch-pack unexpected disconnect while reading sideband packet

    在执行 git clone 命令遇到以下错误: 参考 Github - unexpected disconnect while reading sideband packet,对于 CMD,执行 对于 Linux,执行 对于 PowerShell,执行 然后执行 注意:这里的仓库 URI 必须为 HTTP(https://github.com/),不能为 SSH(git@github.com:)。

    2024年02月11日
    浏览(36)
  • git上传报错:Object too large, rejecting the pack

    在gerrit设置了最大不能上传超过600M的文件,今天开发遇到推送问题: 结果到本地怎么也找不到大文件。 后来只能按commit排查,用如下命令排查到了: 解决方法,将大文件去掉:(commitid为大文件所在commit)

    2024年02月22日
    浏览(32)
  • 成功解决使用git clone下载失败的问题: fatal: 过早的文件结束符(EOF) fatal: index-pack 失败

    1.缓存不够 按照下面操作增加缓存(命令行操作),若是不想使用命令行,也可以在用户家目录下的全局git配置文件 .gitconfig 中,直接更改文件内的内容 使用 git clone 克隆代码时出现以下报错,这个一般是由于代码仓库太大,而本地网络不是很稳定都可以造成以下问题 方法

    2024年01月18日
    浏览(100)
  • BFG Repo-Cleaner 清理在Git历史记录中不需要的数据(git仓库臃肿、git仓库太大、清理git仓库大文件、清理.git\objects\pack中的.pack文件)

    在处理 Git 项目时,可能会遇到一些敏感信息或者大文件被误上传到了仓库,这样会导致仓库变得庞大并且难以管理。这种情况下,BFG Repo-Cleaner 就派上用场了。它是一个更简单、更快速的工具,可以帮助我们从 Git 历史记录中删除不需要的数据。 BFG Repo-Cleaner 是一个由 Scala

    2024年02月02日
    浏览(44)
  • Git 传输大文件,出现:error: Object too large (89,567,972 bytes), rejecting the pack. Max o

    一,本文介绍一下关于使用Git 向云端上传大文件情况下,push时会报如下错误: 在出现上述问题后,怎样把已经add和commit的大文件删除,从而能重新上传的解决办法如下。 1.使用git log,查看传输日志 2.111是本次上传大文件失败日志记录,222为上次传输成功日志记录,使用gi

    2024年03月17日
    浏览(40)
  • 解决git clone项目失败

    git于本地clone github项目时失败,提示错误信息为: 出现这种问题可能是ssl验证出现问题,可以尝试关闭ssl验证。 打开 git bash 输入以下两行命令,可解除ssl验证:

    2024年02月17日
    浏览(49)
  • 解决Git Clone失败,浏览器可以访问github项目,但是git clone失败

    记录一次git clone github上的项目,浏览器可以访问,但是git clone失败的处理过程 一,确认是否能ping通 如果不能ping通,先处理ping问题,详见如下链接 Github无法ping通的解决策略 二,clone项目(第4步才成功) 1,git clone https://… 2,改https为git,git clone git://… 3,重置 http.proxy 4,设置

    2024年01月23日
    浏览(57)
  • JDK项目分析的经验分享

    基本类型的包装类(Character放在最后) String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、StringCharacterIterator、CharsetProvider、CharsetEncoder、CharsetDecoder(较难) java.util.function下的函数表达式 java.nio下的各种Buffer实现 java.lang.ref和jdk.

    2024年02月06日
    浏览(28)
  • git clone 含有子模块的项目

    当一个 git 正常 cloen 项目包含子模块(submodule) 时,直接克隆下来的子模块目录里面是空的。 有两种方法解决:         如果项目已经克隆到了本地,执行下面的步骤: 初始化本地子模块配置文件 更新项目,抓取子模块内容。   另外一种更简单的方法,就是在执行  g

    2024年02月17日
    浏览(24)
  • git无法clone项目连接失败(设置代理)

    代理服务器 就是你的电脑和互联网的中介。当您访问外网时(如http://google.com) , 你的请求首先转发到代理服务器,然后代理服务器替你访问外网,并将结果原封不动的给你的电脑,这样你的电脑就可以看到外网的内容。 路径如下: 你的电脑-代理服务器-外网 外网-代理服务器

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包