当前位置: 首页 > article >正文

Git仓库大文件清理指南

前言

当大文件被提交到 Git 仓库后又删除,但仓库体积仍然很大时,这是因为 Git 保留了这些文件的历史记录。要彻底清理这些文件并减小仓库体积,你需要重写 Git 历史。

注意事项

  1. 这会重写历史 - 所有协作者都需要重新克隆仓库

  2. 备份你的仓库 - 操作前先备份

  3. 通知团队成员 - 因为需要强制推送,会影响所有使用者

  4. 后续提交 - 确保不再提交大文件,考虑添加 .gitignore 规则

使用 git filter-branch

接下来我们使用git filter-branch从Git的整个历史记录中彻底删除某个文件,如下图,在我的gitee中有上传了一些模型文件,占用了大量的内存。

然后我们打开终端,执行游戏git命令,看看是否还有其他大文件。

此命令会显示前10个大文件,并显示文件大小,如 100MB data/large-file.zip

git rev-list --objects --all \| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \| awk '/^blob/ {print $3, $4}' \| sort -n -k1 \| tail -10 \| numfmt --field=1 --to=iec --suffix=B

因为我的是macOS,numfmt 命令在 macOS 上默认不可用,我的命令是用 awk 转换单位。

git rev-list --objects --all \| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \| awk '/^blob/ {print $3, $4}' \| sort -n -k1 \| tail -10 \| awk '{size = $1;if (size >= 1024*1024*1024) printf "%.2fGB %s\n", size/(1024*1024*1024), $2;else if (size >= 1024*1024) printf "%.2fMB %s\n", size/(1024*1024), $2;else if (size >= 1024) printf "%.2fKB %s\n", size/1024, $2;else printf "%dB %s\n", size, $2;}'

从输出情况来看,只有我想删除的文件有超过10MB,因此我可以直接使用限制大小来删除文件。

# 删除所有超过 10M 的文件
git filter-branch --tree-filter 'find . -size +10M -type f -delete' --prune-empty HEAD

然后gie会遍历你所有的历史提交,命令执行完成后接着执行以下命令

# 清理
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now# 强制推送
git push origin --force --all
git push origin --force --tags

预防措施

为避免将来出现此问题:

  • 使用 git-lfs (Git Large File Storage) 管理大文件

  • 设置预提交钩子检查文件大小

  • 在 .gitignore 中添加不应跟踪的文件模式

http://www.lryc.cn/news/2395728.html

相关文章:

  • 华为OD机试真题——最小矩阵宽度(宽度最小的子矩阵)(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • 苹果公司计划按年份来重命名重大的软件,将升级iOS 18软件至iOS 26
  • 园区智能化集成平台汇报方案
  • 奥威BI+AI——高效智能数据分析工具,引领数据分析新时代
  • Spark on Hive表结构变更
  • python做题日记(11)
  • 2025——》NumPy中的np.logspace使用/在什么场景下适合使用np.logspace?NumPy中的np.logspace用法详解
  • STM32F407VET6学习笔记8:UART5串口接收中断的Cubemx配置
  • UE5.5 pixelstreaming插件打包报错
  • Python Django完整教程与代码示例
  • Spring Boot,两种配置文件
  • OpenLayers 地图标注之图文标注
  • 设计模式——简单工厂模式(创建型)
  • qt ubuntu 20.04 交叉编译
  • java中cocurrent包常用的集合类操作
  • 晶振频率稳定性:5G 基站与航天设备的核心竞争力
  • 基于python脚本进行Maxwell自动化仿真
  • Blueprints - List View Widget
  • docker-compose搭建prometheus以及grafana
  • 进阶智能体实战八、需求分析助手(基于qwen多模态大模型对图文需求文档分析)(帮你生成 模块划分+页面+表设计、状态机、工作流、ER模型)
  • Git -> Git Stash临时保存当前工程分支修改
  • 多线程和并发之线程
  • apptrace 的优势以及对 App 的价值
  • android studio debug调试出现 IOException异常
  • PySpark 中使用 SQL 语句和表进行计算
  • [Python] Python中的多重继承
  • 在 RedHat 系统(RHEL 7/8/9)中安装 ​​pythonnet​​ 和 ​​.NET Core​​ 的完整指南
  • vr中风--数据处理模型搭建与训练
  • Socket网络编程之UDP套件字
  • 前端学习(7)—— HTML + CSS实现博客系统页面