git lfs基于二进制安装lfs
Git LFS(Large File Storage)是为了解决 Git 不擅长管理大文件(如模型、视频、二进制包)的问题。普通 Git 对大文件的处理方式是“版本化整个文件”,这在频繁变更时会指数级膨胀仓库体积。
git-lfs-linux-amd64-v3.7.1.tar.gz
本质就是官方编译好的二进制发行版。
一、安装 Git LFS(基于 tar.gz 包)
假设文件在当前目录:

1 | tar -zxvf git-lfs-linux-amd64-v3.7.1.tar.gz |
验证:
1 | git lfs version |
如果输出版本号,说明安装成功。
install.sh 本质是把 git-lfs 二进制放到
/usr/local/bin并做必要的 hook 初始化。
如果你不想用 install.sh,也可以手动:
1 | sudo cp git-lfs /usr/local/bin/ |
二、初始化 LFS
默认install.sh已经初始化lfs,可以忽略
1 | git lfs install |
它会在 ~/.gitconfig 中写入过滤器配置:
1 | [filter "lfs"] |
核心思想:
Git 在提交和 checkout 时通过 filter 机制拦截文件。
三、如何使用
3.1指定哪些文件走 LFS
例如管理模型文件:
1 | git lfs track "*.bin" |
这会生成 .gitattributes 文件:
*.bin filter=lfs diff=lfs merge=lfs -text
必须提交这个文件:
1 | git add .gitattributes |
3.2提交大文件
1 | git add model.bin |
此时 Git 仓库里存的不是大文件本身,而是一个 pointer 文件,例如:
git lfs ls-files
version https://git-lfs.github.com/spec/v1
oid sha256:xxxx
size 104857600
真正的文件会被推送到LFS 服务器。
四、服务端支持
Git LFS 需要远端仓库支持。
常见支持情况:
- GitLab ✔ 支持
- GitHub ✔ 支持(配额限制)
- Gitea ✔ 支持(需启用)
- 纯裸仓库 ❌ 不支持
查看是否启用:
1 | git lfs env |
五、迁移已有仓库的大文件
如果历史里已经有大文件,需要 rewrite:
1 | git lfs migrate import --include="*.zip" |
⚠ 这会重写历史,必须强推:
1 | git push --force |
这和 git filter-repo 原理类似。
六、企业级最佳实践
6.1不要滥用 LFS
LFS 不是“任意大文件仓库”,它适合:
- AI模型
- 构建产物
- 多媒体文件
- 二进制依赖包
不适合:
- 数据库备份
- TB级日志
- 大规模数据仓库存储
这些应该走:
- 对象存储(OSS/S3)
- Artifact 仓库(Nexus/Harbor)
6.2CI/CD 注意事项
在 CI 里必须执行:
1 | git lfs pull |
⚠️:否则拉下来的是 pointer 文件。
GitLab CI 示例:
1 | before_script: |
七、LFS 的底层机制
普通 Git:
文件 → blob → packfile
Git LFS:
文件 → pointer → blob
实际文件 → LFS server (HTTP API)
本质是把大文件剥离出 Git 对象数据库。
你可以这样理解:
Git 管“元数据”
LFS 管“实体数据”
这是一种分层存储设计。
八、性能与容量思考
clone 会不会变慢?
- 会,如果 LFS 文件很多
能否只拉代码不拉大文件?
- 可以:
1 | GIT_LFS_SKIP_SMUDGE=1 git clone ... |
- LFS 文件是否支持缓存?
- 本地缓存目录:
~/.git/lfs
- 本地缓存目录:
九、常见问题排查
9.1push 报 403
一般是:
- 服务器未启用 LFS(必须提前push .gitattributes到仓库)
- Token 权限不足
9.2clone 后文件是文本 pointer
说明没执行:
1 | git lfs pull |