git: 如何减少.git文件的大小?

2023-10-31

1 起因

使用git储存本地笔记时,没有注意到其中包含的视频文件(.avi 大约3个,每个100MB),将其也添加到git的历史记录中(git add . && git commit),虽然之后删除了视频文件本身,但其提交记录永久的留在了 .git中,被git保存为了Blob对象储存起来了,导致 .git目录 400MB+,无法进行push到github,也没有必要,于是开始瘦身之旅。

2 git gc 修剪历史提交

大体来说,当运行 “git gc” 命令时,Git会收集所有松散对象并将它们存入 packfile,合并这些 packfile 进一个大的 packfile,然后将不被任何 commit 引用并且已存在一段时间 (数月) 的对象删除。 此外,Git还会将所有引用 (references) 并入一个单独文件。

命令[1]:git gc --prune=now

就细节而言,Git做了这几件事:

pack_refs 过程
reflog expire 过程
repack 过程
prune 过程
rerere 过程
pack_refs 过程相当于执行"git pack-refs --all --prune",它会将$GIT_DIR/refs目录下的所有heads和tags打包成一个文件并保存为\$GIT_DIR/packed-refs下。

reflog expire 过程相当于执行"git reflog expire --all",它会将删除所有超过期限而且没有被refs涉及的reflog条目。

repack 过程相当于执行"git repack -d -l",一般情况下还会包括"-A"选项,它会将所有未被包含在一个pack的松散对象连结成一个pack,也会将现有的pack重新组织为一个新的更有效率的pack,并删除冗余的pack(如果她们中存在不可达的松散对象,会先把这些对象释放出来)。

prune 过程相当于执行"git prune --expire",他会删除所有过期的、不可达的且未被打包的松散对象。

rerere 过程相当于执行"git rerere gc",这种情形下似乎没什么用。

参考:https://blog.csdn.net/lihuanshuai/article/details/37345565

3 删除.git中的大文件

Step 1. 查看哪些历史提交过文件占用空间较大

使用以下命令可以查看占用空间最多的五个文件:
命令[2]:git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

可以获得类似于以下的结果:
在这里插入图片描述
其中前面为文件的id(hah值),目前不用管,我们需要的是后面的所有内容,为文件的目录+名字。
如这里的名字便是:dadi 12 NodeJs 封装静态WEB服务、 路由、EJS模板引擎、GET、POST(上) (17分23秒)/12 NodeJs 封装静态WEB服务、 路由、EJS模板引擎、GET、POST(上) (17分23秒)/NodeJs 封装静态WEB服务、 路由、EJS模板引擎、GET、POST.avi
(后悔使用这么长的文件名)
如果你的文件名较短或者文件目录比较浅,可能级只是data/xxx.mp4这样的格式。

拓展:
rev-list命令用来列出Git仓库中的提交,我们用它来列出所有提交中涉及的文件名及其ID。 该命令可以指定只显示某个引用(或分支)的上下游的提交。
–objects:列出该提交涉及的所有文件ID。
–all:所有分支的提交,相当于指定了位于/refs下的所有引用。
verify-pack命令用于显示已打包的内容。

这里本来应该是两步:1.找出id;2根据id找出文件名
两步的方法:
在这里插入图片描述
更多资料请访问文末参考中的[2]知乎回答

Step 2. 重写commit,删除大文件

命令[3]:git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 'yourFileName'" --prune-empty --tag-name-filter cat -- --all
这里需要把命令中的 yourFileName改成上一步获取到的文件名称。
例如:git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 'dadi 11 nodejs创建一个静态WEB服务器 读取文件获取响应类型 处理异步(下)/11 nodejs创建一个静态WEB服务器 读取文件获取响应类型 处理异步(下)/nodejs创建一个静态WEB服务器 读取文件获取响应类型 处理异步.avi'" --prune-empty --tag-name-filter cat -- --all

结果示例:
在这里插入图片描述
成功会显示 Rewrite xxxx(233/666).
如果显示 xxxxx unchanged, 说明repo里没有找到该文件, 请检查路径和文件名是否正确。

重复上面的脚本,把所有你想删除的文件都删掉。

step 3. 进行repack

命令[4]:

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

作者:郑宇
链接:https://www.zhihu.com/question/29769130/answer/315745139
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

step 4. 查看 pack 的空间使用情况

命令[5]:git count-objects -v

step 5. 推送修改后的repo

以强制覆盖的方式推送你的repo, 命令如下:
命令[6]:git push origin master --force

step 6. 清理和回收空间

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

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now

4 END 和 注意事项

至此你会发现.git的大小已经变为正常大小,瘦身完成。
注意:以上内容参考了文末参考文章,经过整合可能会有重复的步骤,比如gc了两次,不过多做无害,如果有更为精简的实验方法欢迎讨论。
注意2:以上内容最好都在 git bash中运行,不要再vs code 的命令行(即windows的cmd),否则会不能识别命令。

在这里插入图片描述
Input file specified two times.

‘tail’ is not recognized as an internal or external command,
operable program or batch file.

‘grep’ is not recognized as an internal or external command,
operable program or batch file.

参考

  1. 记一次删除Git记录中的大文件的过程
  2. 如何解决 GitHub 提交次数过多 .git 文件过大的问题? - 郑宇的回答 - 知乎
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git: 如何减少.git文件的大小? 的相关文章

随机推荐

  • Spring Boot 学习研究笔记(二十)-docker部署SpringBoot使用nginx配置域名

    Docker发布项目使用Nginx配置域名 步骤如下 第一步 在Docker 中部署SpringBoot JAR 包 详情请查看 Spring Boot 学习研究笔记 十二 Dcoker 中部署SpringBoot jar包 第二步 配置域
  • metric_logger小解

    今天看见这个一个函数metric logger 通过搜索资料发现他是utils中的一个MetricLogger类 可称它为度量记录器 因为这种都是自定义的 那我只说说我遇见的这个趴 我们先来看看他初始化里有什么 def init self
  • VMware14安装虚拟机出错——Intel VT-x处于禁用状态

    解决方法 进入BIOS 模式中 开启Intel VT x 具体步骤 win10 1 打开设置 搜索 高级启动 选择更改高级启动选项设置 然后点击立即启动 2 启动后 在蓝屏界面中选择疑难解答 gt 高级选项 gt UEFI固件设置 gt 选
  • 【matlab图像处理】插值方法

    中国史之 懿王攻犬戎 周懿 yi 王攻打犬戎的战争 周懿王在位时期 西周衰弱 戎族不断入侵周朝 一度打到镐 今陕西西安 岐 今陕西岐县 等地 懿王被迫迁都槐里 今陕西兴平县 周懿王派虢 guo 公率军北伐犬戎 企图收复失地 但不幸战败 来源
  • 抽象类、模板方法

    抽象类理解为一种模板 模板模式 使用 package com example demo author dc version 1 0 date 2023 03 28 12 55 public abstract class DayPlan pu
  • PMOS开关管的选择与电路图

    中心议题 探讨 解决方案 选用N沟道还是P沟道 确定额定电流 确定热要求 首先要进行MOSFET的选择 MOSFET有两大类型 N沟道和P沟道 在功率系统中 MOSFET可被看成电气开关 当在N沟道MOSFET的栅极和源极间加上正电压时 其
  • centos7 配置网络_linux入门系列11--Centos7网络服务管理

    通过前面文章的学习已经掌握了Linux系统配置管理的知识 本文讲解Centos7网络配置知识 Linux要对外提供服务 需要保证网络通信正常 因此需要正确配置网络参数 本文将讲解如何使用Network Manager配置网络参数 管理网络会
  • MATLAB中复数矩阵的转置、共轭及共轭转置

    参考博客 https blog csdn net zhaozhichenghpu article details 79162287 MATLAB中生成一个复数矩阵 MATLAB中复数矩阵的共轭用conj A MATLAB中复数矩阵的转置 A
  • 安卓USB模块源码分析(一)- 准备

    介绍USB服务在Android服务体系中的位置 源码的位置及使用AndroidStudio 查看USB模块FWK的配置方式 Windows环境准备 WSL2安装及AOSP源码下载编译 shimo im 安卓服务概览 Android 主要有如
  • os.walk()的使用方法

    os walk 主要用来扫描某个指定目录下所包含的子目录和文件 这篇文章将通过几个简单的例子来说明python中os walk 的使用方法 一 从上到下 遍历目录 该文件夹 和子目录 子文件夹 以及文件 txt等 假设我们的test文件夹有
  • 如何在JavaScript中实现继承?

    聚沙成塔 每天进步一点点 专栏简介 原型链继承 借用构造函数继承 构造函数继承 组合继承 原型式继承 寄生式继承 寄生组合式继承 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航
  • 内核模式代码签名走查(四)

    如何禁用测试计算机上的强制签名 在驱动程序开发的早期阶段 开发人员签署每个构建都可能很麻烦 因为这个原因 WindowsVista提供了几个方式来临时禁用内核模式代码签名实施 以便测试计算机可以安装和加载未签名的驱动程序 附加一个内核调试器
  • Java语言程序设计(一)选择题

    1 1 如下哪个是 Java中的标识符 A public B super C 3number D width 2 如下哪个是 Java中的标识符 A fieldname B super C 3number D number 3 已知如下定义
  • Linux IO协议栈框图

    Linux IO协议栈框图 来源 http www thomas krenn com en oss linux io stack diagram linux io stack diagram v0 1 pdf
  • sqli-labs-master sql注入靶场(10、11、12)

    sqli labs master sql注入靶场 10 12 pass 10 首先 这题用sqlmap跑不出来 sqlmap提示我们这题是时间盲注 无论我们输入什么 不管对错页面都是You are in 我们用sleep函数来判断对错 如果
  • [工业互联-3]:工业有线互联总线之工业以太网总线

    目录 第1章 工业以太网概述 1 1 概述 1 2 工业以太网与普通以太网的比较 1 3 以太网在工业控制领域中应用的优势 1 4 工业以太网与其他工业互联总线的比较 第2章 工业以太网网络部署 第3章 工业以太网网络协议栈 3 1 传统以
  • LTspice introduction - 2 LTspice的界面

    LTspice的界面主要有两个 Schematic Capture和Waveform Viewer Schematic Capture 它主要是用来画电路图的 画完电路图之后 添加一些dot 命令同时选择一些仿真的参数 点击执行 Run W
  • dell服务器维护软件,Dell服务器硬件,RAID等查询和维护软件OMSA

    Dell服务器查询和维护软件OMSA OMSA OpenManageServerAdministrator 是Dell主机的硬件检测和维护软件 OMSA OpenManage 下载地址 http linux dell com repo ha
  • Golang 单元测试

    想要测试Go代码需要依赖go test命令 需注意如下事项 在包目录内所有测试文件必须以 test go结尾 go build不会把这些测试文件编译到最终的可执行文件中 在 test go文件中 单元测试函数的名字须以TestXxxx的形式
  • git: 如何减少.git文件的大小?

    1 起因 使用git储存本地笔记时 没有注意到其中包含的视频文件 avi 大约3个 每个100MB 将其也添加到git的历史记录中 git add git commit 虽然之后删除了视频文件本身 但其提交记录永久的留在了 git中 被gi