13. 仓库越来越大?Git LFS 让图片视频不再撑爆仓库
「Git」系列已发布: 00. 改崩代码不敢回退?Git 版本控制 3 分钟救你狗命 | 01. Git 装完不会配?Windows/macOS/Linux 三端配置一次到位 | 02. Git 配置总踩坑?全局/仓库/SSH 密钥一次搞懂 | 03. add/commit/push 别再死记:Git 工作流核心概念实操 | 04. Git 分支管理:5 步彻底搞懂 branch 与 merge | 05. clone/fetch/pull/push 分不清?Git 远程协作实战 | 06. 给版本打上永久印记:Git 标签管理与发布实战 | 07. 切分支怕丢改动?Git stash 暂存恢复保护现场 | 08. rebase 不是 merge 的替代品:Git 故事线重构进阶 | 09. Git 日志与调试:log/blame/diff 让历史无所遁形 | 10. 提交代码自动检查:Git Hooks 实战,质量不再靠人工 | 11. 多仓库依赖怎么管?Git 子模块统一版本一键更新 | 12. GitFlow vs GitHub Flow vs 主干:团队工作流 3 选 1 | 13. 仓库越来越大?Git LFS 让图片视频不再撑爆仓库(本文)
把几 GB 的视频塞进 Git,仓库立刻肿成乌龟。Git LFS 把大文件存在外部存储,仓库轻了、克隆快了,历史也不再臃肿。
远程仓库操作(第 05 篇)要熟。得装好 Git LFS 客户端,备一个支持 LFS 的远程仓库。
一、为什么要 Git LFS
Git 生来是为文本文件设计的版本控制系统。仓库里冒出一堆大文件(二进制、数据集、多媒体)的时候,问题就来了。
1.1 Git 碰上大文件的三个坑
仓库体积膨胀
Git 存的是文件完整快照,不是差异。一个 50MB 的设计稿改 10 版 → 仓库多 500MB。clone 和 fetch 慢到让人怀疑人生,新人入职等于先等半小时。
内存和性能gc、repack、diff这些操作要把文件加载到内存。几个大文件下去,要么 OOM,要么卡死。
托管平台限制
| 平台 | 仓库大小限制 | 单文件限制 |
|---|---|---|
| GitLab.com | 10 GB | 5 GB |
| GitHub | 5 GB | 100 MB |
| Gitee | 1 GB | 50 MB |
1.1.1 LFS 怎么解决
Git LFS(Large File Storage)把大文件实际内容存到独立的 LFS 服务器上,Git 仓库里只放一个轻量指针:
# Git 仓库中存储的指针文件
version <https://git-lfs.github.com/spec/v1>
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
size 52428800
# 实际文件在 LFS 服务器上,checkout 时按需下载
1.2 安装与配置
1.2.1 安装
# macOS
brew install git-lfs
# Ubuntu/Debian
sudo apt install git-lfs
# CentOS/RHEL
sudo yum install git-lfs
# 验证
git lfs version
# git-lfs/3.4.0 (GitHub; darwin amd64; go 1.21)
1.2.2 初始化
# 每个用户只需一次
git lfs install
# Updated Git hooks.
# Git LFS initialized.
1.2.3 LFS 服务器
常见托管平台都内置 LFS 支持——GitLab、GitHub 开箱即用,Gitee 需要开通。
自定义 LFS 服务器:
git config -f .lfsconfig lfs.url <https://lfs.example.com/team-project>
git add .lfsconfig
1.3 追踪大文件
1.3.1 按类型追踪
# 追踪特定扩展名
git lfs track "*.psd"
git lfs track "*.zip"
git lfs track "*.mp4"
# 追踪特定目录
git lfs track "assets/images/*.png"
git lfs track "datasets/*.csv"
# 查看当前追踪规则
git lfs track
# Listing tracked patterns
# *.psd (.gitattributes)
# *.zip (.gitattributes)
git lfs track会自动写.gitattributes:
# .gitattributes
*.psd filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text
1.3.2 手动指定单个文件
git lfs track "path/to/large-file.bin"
1.3.3 迁移历史中的大文件
# 把历史中某类文件迁移到 LFS
git lfs migrate import --include="*.psd,*.mp4" --everything
# 迁移特定分支
git lfs migrate import --include="*.zip" --include-ref=main
git lfs migrate import --include="*.zip" --include-ref=develop
# 模拟运行——先看效果
git lfs migrate import --include="*.psd" --everything --verbose --dry-run
注意:git lfs migrate会重写 Git 历史。团队全部知情、备份完成后再跑。跑完所有人要重新 clone。
1.4 日常使用
# 添加 LFS 追踪的大文件——和普通文件一样
git add design-v2.psd
# 看 LFS 状态
git lfs status
git commit -m "feat: 更新 v2 设计稿"
git push origin main
# 推送时 LFS 文件传输到 LFS 服务器
1.4.1 拉取
# clone 时自动拉(Git 2.14+)
git clone git@gitlab.com:team/project.git
# clone 后缺少 LFS 文件
git lfs pull
# 只拉当前分支需要的
git lfs fetch
# 拉所有
git lfs fetch --all
1.4.2 查看信息
# 当前分支的 LFS 文件
git lfs ls-files
# 所有分支
git lfs ls-files --all
# 看占用
git lfs ls-files --all --size
1.5 高级配置
1.5.1 按分支筛选
# clone 时只拉最新提交的 LFS 文件
GIT_LFS_SKIP_SMUDGE=1 git clone git@gitlab.com:team/project.git
cd project
git lfs pull --include="assets/*"
# 全局配置
git config --global lfs.fetchinclude "assets/*,*.mp4"
git config --global lfs.fetchexclude "datasets/*"
1.5.2 文件锁定
对于不可合并的二进制文件(.psd、.blend),可以启锁定:
# 管理员启用
git config lfs.<https://gitlab.com/team/project.git/info/lfs.locksverify> true
# 编辑前锁定
git lfs lock design-v2.psd
# 查看锁定
git lfs locks
# 编辑完解锁
git lfs unlock design-v2.psd
1.5.3 清理本地缓存
# 释磁盘空间
git lfs prune
# 先看会清什么
git lfs prune --dry-run --verbose
# 保留近期的
git lfs prune --recent
# 自定义保留天数
git config lfs.pruneoffsetdays 7
1.6 LFS + CI/CD
# .gitlab-ci.yml
variables:
GIT_LFS_ENABLED: "true"
# 或手动装
before_script:
- apt-get update && apt-get install -y git-lfs
- git lfs install
- git lfs pull
镜像预装:
FROM golang:1.21-alpine
RUN apk add --no-cache git-lfs
RUN git lfs install
1.7 常见问题
1.7.1 推送后别人拉到空文件
# 检查 .gitattributes 是否已提交
git show HEAD:.gitattributes
# 确认 LFS 文件是否正确推送
git lfs ls-files --all
# 确认服务端 LFS 支持
curl -H "Accept: application/vnd.git-lfs+json" \
<https://gitlab.com/team/project.git/info/lfs/objects/batch
1.7.2 clone/pull 超时
# 加大超时
git config lfs.activitytimeout 60
git config lfs.tlsexptimeout 60
# 控制并发
git config lfs.concurrenttransfers 4
1.8 文章引用
二、系列文章 · Git 从入门到精通
本系列共 20 篇,建议从 00 开始顺序阅读。
| 序号 | 文章 | 状态 |
|---|---|---|
| 00 | 改崩代码不敢回退?Git 版本控制 3 分钟救你狗命 | 已发布 |
| 01 | Git 装完不会配?Windows/macOS/Linux 三端配置一次到位 | 已发布 |
| 02 | Git 配置总踩坑?全局/仓库/SSH 密钥一次搞懂 | 已发布 |
| 03 | add/commit/push 别再死记:Git 工作流核心概念实操 | 已发布 |
| 04 | Git 分支管理:5 步彻底搞懂 branch 与 merge | 已发布 |
| 05 | clone/fetch/pull/push 分不清?Git 远程协作实战 | 已发布 |
| 06 | 给版本打上永久印记:Git 标签管理与发布实战 | 已发布 |
| 07 | 切分支怕丢改动?Git stash 暂存恢复保护现场 | 已发布 |
| 08 | rebase 不是 merge 的替代品:Git 故事线重构进阶 | 已发布 |
| 09 | Git 日志与调试:log/blame/diff 让历史无所遁形 | 已发布 |
| 10 | 提交代码自动检查:Git Hooks 实战,质量不再靠人工 | 待发布 |
| 11 | 多仓库依赖怎么管?Git 子模块统一版本一键更新 | 待发布 |
| 12 | GitFlow vs GitHub Flow vs 主干:团队工作流 3 选 1 | 待发布 |
| 13 | 仓库越来越大?Git LFS 让图片视频不再撑爆仓库 | 待发布 |
| 14 | 合并冲突不是噩梦:Git 合并策略与冲突解决 | 待发布 |
| 15 | 常用命令记不住?Git 别名让操作变成快捷键 | 待发布 |
| 16 | 仓库太大会卡顿?git gc + bfg 清理历史垃圾实战 | 待发布 |
| 17 | 把密码提交进 Git?安全实践:密钥管理与审计日志 | 待发布 |
| 18 | IDE 里的 Git 怎么用?VS Code/IntelliJ 集成效率翻倍 | 待发布 |
| 19 | 删了分支找不回?Git 常见问题排查与修复指南 | 待发布 |
上一篇:GitFlow vs GitHub Flow vs 主干:团队工作流 3 选 1 | 下一篇:合并冲突不是噩梦:Git 合并策略与冲突解决
📌 本文首发于微信公众号 【运维知识点滴】——专注运维实战干货,微信搜索“运维知识点滴”或扫下方二维码关注,更新不迷路。
| 微信公众号【运维知识点滴】 | 微信小程序【A5单据合并&大试卷拆分转A4打印】 |
|---|---|
![]() |
![]() |
| 运维实战干货 · 关注追更 | Word 转 PDF · 试卷/发票打印神器 · 免费 |
💡 小程序【A5单据合并&大试卷拆分转A4打印】是干嘛的? 一个 Word 转 PDF 的打印神器,专治“文档版式和打印机对不上”:
- A3 试卷打不出来? 学校发的电子版试卷多是 A3,家用打印机只吃 A4——上传 Word 一键转换:可缩到一页 A4(页数不变),也可对半拆成两张 A4(1:1 原大、字更清晰),两种模式自选;
- 版式不乱:真实渲染引擎原样转换、绝不重排内容,转出的 PDF 和原 Word 排版一致,公式/表格/图片不跑版;
- 两张 A5 单据拼一张 A4:出租车票、火车票等报销凭证拼版后,一次打印、整齐粘贴;
- 隐私省心:无需注册,转换结果留存 5 天、最多下载 5 次即自动删除,不留任何历史记录;
- 微信扫码即用,免费、免安装,支持 doc / docx(≤50MB)。

