git lfs基于二进制安装lfs

Git LFS(Large File Storage)是为了解决 Git 不擅长管理大文件(如模型、视频、二进制包)的问题。普通 Git 对大文件的处理方式是“版本化整个文件”,这在频繁变更时会指数级膨胀仓库体积。

  • git-lfs-linux-amd64-v3.7.1.tar.gz

本质就是官方编译好的二进制发行版。


一、安装 Git LFS(基于 tar.gz 包)

假设文件在当前目录:

f8542e98aedc6e3dab5af0445b6fe47f.png

1
2
3
4
tar -zxvf git-lfs-linux-amd64-v3.7.1.tar.gz
cd git-lfs-3.7.1
./install.sh ### /usr/local/bin
./install.sh --local ### ~/.local

验证:

1
git lfs version

如果输出版本号,说明安装成功。

install.sh 本质是把 git-lfs 二进制放到 /usr/local/bin 并做必要的 hook 初始化。

如果你不想用 install.sh,也可以手动:

1
2
sudo cp git-lfs /usr/local/bin/
sudo chmod +x /usr/local/bin/git-lfs

二、初始化 LFS

默认install.sh已经初始化lfs,可以忽略

1
git lfs install

它会在 ~/.gitconfig 中写入过滤器配置:

1
2
3
4
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process

核心思想:
Git 在提交和 checkout 时通过 filter 机制拦截文件。


三、如何使用

3.1指定哪些文件走 LFS

例如管理模型文件:

1
2
git lfs track "*.bin"
git lfs track "*.zip"

这会生成 .gitattributes 文件:

*.bin filter=lfs diff=lfs merge=lfs -text

必须提交这个文件:

1
2
git add .gitattributes
git commit -m "enable lfs"

3.2提交大文件

1
2
3
git add model.bin
git commit -m "add model"
git push

此时 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
2
3
before_script:
- git lfs install
- git lfs pull

七、LFS 的底层机制

普通 Git:

文件 → blob → packfile

Git LFS:

文件 → pointer → blob
实际文件 → LFS server (HTTP API)

本质是把大文件剥离出 Git 对象数据库。

你可以这样理解:

Git 管“元数据”
LFS 管“实体数据”

这是一种分层存储设计


八、性能与容量思考

  1. clone 会不会变慢?

    • 会,如果 LFS 文件很多
  2. 能否只拉代码不拉大文件?

    • 可以:
1
GIT_LFS_SKIP_SMUDGE=1 git clone ...
  1. LFS 文件是否支持缓存?
    • 本地缓存目录:~/.git/lfs

九、常见问题排查

9.1push 报 403

一般是:

  • 服务器未启用 LFS(必须提前push .gitattributes到仓库)
  • Token 权限不足

9.2clone 后文件是文本 pointer

说明没执行:

1
git lfs pull