git lfs 通过精准声明(git lfs track)、pre-push 钩子强制校验、.gitattributes 提交约束及历史迁移四步,实现多媒体资产与代码物理分离,确保大文件仅存指针于 git,真实内容由 lfs 服务托管。

要让 Git 强制把多媒体资产(如图片、视频、音频、模型文件等)交给 LFS 管理,而核心代码仍走原生 Git,关键不是“强制拦截”,而是通过 精准声明 + 钩子绑定 + 提交约束 实现物理拆分。整个过程不修改 Git 本身,但能确保大文件绝不会以原始二进制形式进入 Git 对象库。
明确哪些文件必须走 LFS
用 git lfs track 声明扩展名或路径模式,这是物理拆分的第一道闸门:
- 常见多媒体格式可一次性覆盖:
git lfs track "*.psd" "*.ai" "*.mp4" "*.wav" "*.glb" "assets/**/*" - 机器学习场景建议按目录隔离:
git lfs track "models/*.bin" "datasets/*.zip" - 执行后会自动生成或更新
.gitattributes,务必git add .gitattributes并提交——没有它,LFS 规则不生效
启用 pre-push 钩子并验证上传行为
git lfs install 不仅安装过滤器,更重要的是注册 pre-push 钩子。这个钩子会在每次 git push 前检查:
- 是否含有新提交的 LFS 跟踪文件
- 这些文件是否已上传到远程 LFS 服务器(如 GitHub/GitLab/Codeup)
- 若未上传,push 会失败,并提示类似
batch request: missing object的错误
这种失败即为“强制执行”:你无法跳过 LFS 流程直接把大文件塞进 Git 历史。
防止误提交的本地防护机制
仅靠 .gitattributes 和钩子还不够,需叠加两层预防:
- 在项目根目录添加
.gitignore补充规则,例如:**/*.zip、**/cache/—— 避免非 LFS 路径下意外出现大文件 - 运行
git lfs migrate import --include="*.mp4,*.psd" --exclude="src/**"(需 Git LFS ≥3.0),可将历史中已存在的大文件批量转为 LFS 指针,清理 Git 对象库体积 - CI/CD 流水线中加入检查脚本:
git lfs ls-files --all | wc -l非零才允许构建,确保环境始终遵循拆分策略
远程仓库需支持 LFS 且容量充足
物理拆分最终依赖远程服务承载真实大文件:
- GitHub / GitLab / 极狐 / Codeup 默认启用 LFS,无需额外部署
- 私有 Git 服务器(如 Gitea、GitBlit)需单独配置 LFS 对象存储后端(如 S3、MinIO)
- 确认配额:例如 Codeup 默认每仓库 5GB LFS 容量,超限时 push 会被拒绝,需提前清理或扩容
完成以上四步后,多媒体资产与代码在存储层彻底分离:Git 只存指针和文本逻辑,LFS 服务专管二进制内容。日常操作无感,但仓库克隆速度、分支切换响应、磁盘占用均显著改善。











