模型文件硬塞进 Git,GitHub 直接打回原形:使用Git-LFS管理大文件
wptr33 2025-09-12 04:07 26 浏览
前言
最近接手了一个计算机视觉项目
代码是屎山就不说了,反正我也不看代码
主要就是构建一下 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种路径
与万千技术人共建智能开发新范式。
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- 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)
