Git LFS(Large File Storage, 大文件存储)是 Github 开发的一个 Git 的扩展,用于实现 Git 对大文件的支持。

Git LFS可以把音乐、图片、视频等指定的任意文件存在 Git 仓库之外,而在 Git 仓库中用一个占用空间 1KB 不到的文本指针来代替文件的存在。

通过把大文件存储在 Git 仓库之外,可以减小 Git 仓库本身的体积,使克隆 Git 仓库的速度加快,也使得 Git 不会因为仓库中充满大文件而损失性能。

要使用 Git LFS 只需要经过一次下载安装后,指定需要由 Git LFS 管理的文件即可。

GIT LFS 使用三步骤

第一步: 安装 lfs

# 记得先下载安装 git-lfs 命令行 https://git-lfs.github.com/
git lfs install

会安装了一个pre-hook

第二步: 使用 git lfs track 追踪需要使用 Git LFS 管理的文件。运行命令:

# track 文件
git lfs track "*.psd"`

# track 目录, 注意是双星号, 需要带引号, 防止被 bash 解析
git lfs track "image/**"

# 查看已经 track 文件和目录
git lfs track

也可以手动编辑 Git 仓库根目录下的 .gitattributes 文件,如:

vim .gitattributes

documents_library/mainlib.db filter=lfs diff=lfs merge=lfs -text
exported/** filter=lfs diff=lfs merge=lfs -text
documents_library/docs/media/** filter=lfs diff=lfs merge=lfs -text

第三步: 添加 .gitattributes 文件,推送到远端,即可完成对大文件的管理

git add .gitattributes
git commit -am "msg"
git push origin master

原理: 关于 LFS 的指针文件

FS 的指针文件是一个文本文件,存储在 Git 仓库中,对应大文件的内容存储在 LFS 服务器里,而不是 Git 仓库中,下面为一个图片 LFS 文件的指针文件内容:

version https://git-lfs.github.com/spec/v1
oid sha256:5b62e134d2478ae0bbded57f6be8f048d8d916cb876f0656a8a6d1363716d999
size 285

指针文件很小,小于 1KB。其格式为 key-value 格式,第一行为指针文件规范 URL,第二行为文件的对象 id,也即 LFS 文件的存储对象文件名,可以在.git/lfs/objects 目录中找到该文件的存储对象,第三行为文件的实际大小(单位为字节)。所有 LFS 指针文件都是这种格式。

格式规范文档: >传送门<

哪些 Git 源码管理支持 LFS

目前基本主流的代码仓库都已经支持

其他类似技术

VFS for Git: https://vfsforgit.org/

  • c# 编写,依赖.NET, 没有跨平台
  • 不是git扩展, 更像是GIT的文件系统

参考文档