模型文件硬塞进 Git,GitHub 直接打回原形:使用Git-LFS管理大文件
wptr33 2025-09-12 04:07 17 浏览
前言
最近接手了一个计算机视觉项目
代码是屎山就不说了,反正我也不看代码
主要就是构建一下 docker 镜像,测试一下部署的兼容性
这本来不难
但是,国内服务器的网络环境实在是恶劣,需要配置各种镜像(docker镜像、apt镜像、pip镜像),这些镜像还各有各的问题,结果就是搭配下来一直无法构建成功。
之后我灵机一动,利用 GitHub Actions 来构建镜像,以 GitHub 的服务器网络,所有问题不就迎刃而解了吗?
试了之后果然可以成功构建出镜像
不过中途也踩了一些坑,比如大文件的问题
之前的项目没遇到过大文件,因为我从不把 PyTorch 的模型文件放在代码里跟着提交到 git 里!
能做出这种操作的,多少带点那啥
GitHub对大文件的限制
GitHub 文件大小限制:
-
单个文件 > 50MB 会有警告
-
单个文件 > 100MB 会直接被拒绝推送
结果就是:
Writing objects: 100% (304/304), 463.41 MiB | 3.23 MiB/s, done. Total 304 (delta 32), reused 0 (delta 0), pack-reused 0 (from 0) remote: Resolving deltas: 100% (32/32), done. remote: warning: File fire_detection/yolov5l.pt is 88.50 MB; this is larger than GitHub's recommended maximum file size of 50.00 MB remote: error: Trace: 52267c96d371181694b02dad5eebead817ce6d985e2f8d356c2b458adfbb2a09 remote: error: See https://gh.io/lfs for more information. remote: error: File runs/detect/fire_smoke_detection/weights/best.pt is 166.91 MB; this exceeds GitHub's file size limit of 100.00 MB remote: error: File runs/detect/fire_smoke_detection/weights/best.pt is 250.32 MB; this exceeds GitHub's file size limit of 100.00 MB remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com. To github.com:cppstudio/fire-detection.git ! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to 'github.com:studio/fire-detection.git'
解决办法就是用 **Git LFS (Large File Storage)**,GitHub 官方提供的专门存储大文件(模型权重、二进制、音频视频)的功能。
不过这个也挺抠门的,GitHub LFS 免费额度只有 1GB 存储 + 1GB 流量,超出需要买额外配额(或者用 HuggingFace/百度网盘/OSS 等托管模型文件)。
如果只是存 .pt
模型,可以考虑把权重放 HuggingFace,然后在 README 里写下载链接。
安装 git-lfs 工具
每个系统都能很容易安装
# Linux (Ubuntu/Debian)
sudo apt install git-lfs
# macOS (brew)
brew install git-lfs
# Windows (scoop)
scoop install git-lfs
然后初始化
git lfs install
跟踪大文件类型
比如说在本文的场景里,.pt
模型文件很大,可以指定让 LFS 管理
git lfs track "*.pt"
这会在仓库生成一个 .gitattributes
文件,内容大概是
*.pt filter=lfs diff=lfs merge=lfs -text
记得把这个 .gitattributes
也提交进 git
git add .gitattributes
git commit -m "track large files with Git LFS"
重新提交大文件
之前的提交如果包含了大文件
需要把这些大文件重新提交到 LFS
好在 git-lfs 提供了很方便的命令来清理历史,不然就得用我之前发的那篇文章里的方法来清理大文件了。详见: [1]
# 用 git lfs migrate 自动替换历史中的大文件
git lfs migrate import --include="*.pt"
# 强制推送
git push origin master --force
之后正常执行推送操作就行了
git push origin master
GitHub 就会把大文件存到 LFS,而不是普通 Git 仓库里。
拉取大文件
用了 Git LFS之后,仓库里保存的大文件(比如.pt
)在普通git clone
的时候只会看到一个指针文件(几十字节,记录了真实文件在 LFS 存储里的位置)。
要把大文件本体下载下来,必须要安装过 Git LFS。
具体情况
- 如果机器上没装 Git LFS:clone 下来后,大文件就是“指针文件”,打不开、用不了。
- 如果机器上装了 Git LFS:clone 时会自动替换成真正的大文件。
- 如果已经 clone 过但大文件没拉下来:可以手动执行:
git lfs pull
所以通常项目 README 里会写一句提示:
## 注意
本项目使用 [Git LFS](https://git-lfs.github.com/ "Git LFS") 管理大文件(模型权重等)。
请先执行:
```bash
git lfs install
git lfs pull
```
小结
这次折腾 GitHub 大文件问题,其实给了我几点启发:
- GitHub 的限制:超过 100MB 的文件是绝对过不去的,别想着强行提交。
- Git LFS 的价值:官方解决方案简单好用,但免费额度很抠,适合小规模文件管理。
- 替代方案:如果模型文件动辄几百 MB,推荐放在 HuggingFace、OSS、百度网盘等专门的存储平台,再在代码里提供下载脚本或链接。
- 最佳实践:代码就是代码,模型就是模型,别混着提交;把仓库保持干净,后期协作和部署都省心。
简单一句话总结:学会用 Git LFS,能应急;但别把它当免费网盘用。
另外,再多嘴一句:这个项目看着就像典型的“大学生作业仓库”——代码像屎山,模型直接丢进 git 里,八成还是教授一拍脑袋甩给研究生的“科研成果”。说实话,能跑起来已经算奇迹了 。
参考资料
[1]
如何清理误提交到git的历史大文件?:
https://blog.deali.cn/p/clean-git-history-large-files
解锁AI驱动的生产力跃迁
程序设计实验室专注前沿技术落地,每周解析代码级解决方案。
关注获取:
《DeepSeek极速上手手册》24页干货:零基础3天玩转智能编码
清华独家课程三部曲:
《DeepSeek从入门到精通》104页精讲(附30+代码实例)
《职场效能革命指南》35页实战:7大行业应用场景深度拆解
《AI红利捕获手册》65页秘籍:普通人快速构建竞争壁垒的5种路径
与万千技术人共建智能开发新范式。
相关推荐
- MySQL进阶五之自动读写分离mysql-proxy
-
自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...
- 3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?
-
引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...
- 一文由浅入深带你完全掌握MySQL的锁机制原理与应用
-
本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...
- 验证Mysql中联合索引的最左匹配原则
-
后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...
- MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
-
目录1.索引基础...
- 你会看 MySQL 的执行计划(EXPLAIN)吗?
-
SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...
- MySQL 从入门到精通(四)之索引结构
-
索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...
- mysql总结——面试中最常问到的知识点
-
mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...
- mysql总结——面试中最常问到的知识点(2)
-
首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...
- MySQL基础全知全解!超详细无废话!轻松上手~
-
本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...
- 深入剖析 MySQL 中的锁机制原理_mysql 锁详解
-
在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...
- Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析
-
引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...
- MySQL基础篇:DQL数据查询操作_mysql 查
-
一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...
- MySql:索引的基本使用_mysql索引的使用和原理
-
一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
如何将AI助手接入微信(打开ai手机助手)
-
Java面试必考问题:什么是乐观锁与悲观锁
-
SparkSQL——DataFrame的创建与使用
-
redission YYDS spring boot redission 使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)