Git Large File Storage (LFS) 是一个由 GitHub 开发的 Git 扩展项目, 用于增强 Git 对大文件追踪的支持.
Git 对于一些二进制,及大文件的处理一直不是很好,二进制文件的对比,差量存储都未能优化处理。
这导致了在 Git 的仓库中,会储存二进制文件的所有历史全量版本。这样一来,会给储存带来很大的困扰,同时在进行 Clone/Fetch/Pull 时都会产生大量的流量,特别是在一些网络不大好的地方。
而 Git LFS 就是为了解决这一问题而产生的工具。它将标记的大文件保存至另外的地方,而在主仓库仅保留其轻量级指针。这样在获取版本时,只更新主库对应的大文件,会更加轻量,高效。
主要的特征如下:
- 超大文件支持
- 减小仓库占用空间
- 更高的远程获取效率
- 和 Git 操作保持一致
▎安装
1 | # macOS with HomeBrew |
为 Git 账号进行初始化设置(只需要一次)
1 | $ git lfs install |
▎使用
> 配置 LFS
在需要使用 LFS 的项目中,通过 git lfs trace
配置需要加入 LFS 的文件,可以使用通配符。
编辑完之后,会创建或修改项目的 .gitattributes
,也可以通过手工修改该文件来进行配置。
1 | $ git lfs track "*.bin" |
> 将 .gitattributes 加入到仓库中
1 | $ git add .gitattributes |
执行 push 时会输出一些 LFS 的指示
1 | $ git push |
> 查看文件的状态
1 | $ git show HEAD:cat.bin |
输出当前文件关于 LFS 的一些值:
1 | On branch master |
▎操作命令
> 基本操作
1 | $ git lfs track |
> 其它操作
显示当前仓库的 env 配置:
1 | $ git lfs env |
LFS 文件操作
1 | $ git lfs ls-files |
正常情况下会随着 git pull/push 一起执行
如果在 git pull/push 的过程中断了, 导致二进制文件没有被拉取的时候, 可以使用这些命令(支持断点续传,速度不慢)
▎常见问题
> Git LFS 迁移 - 已提交 git 文件的处理
已经被 git 提交了,怎么转到 LFS 里呢?
这时就要把 git 的旧记录也一并删除,不然该文件及历史版本,会一直存在 Git 的数据中,每次获取都占用大量带宽和存储空间。
1 | $ git lfs migrate |
上述操作,会将所有的 git 对象,转换为 git-lfs 对象,git 历史记录会受影响。
但 .git 目录下依然储存着该文件,需要进行清空处理:
1 | # 然后使用如下命令清理 .git 目录 |
> 如何只获取仓库本身,而不获取任何 LFS 对象?
如果相关工作不涉及到被 Git LFS 所管理的文件的话,可以选择只获取 Git 仓库自身的内容,而完全跳过 LFS 对象的获取。
1 | $ GIT_LFS_SKIP_SMUDGE=1 git clone git@github.com:username/my_lfs_repo.git destination_dir |
使用该方式 Clone 仓库后,又需要这些 LFS 管理的文件了,如何再次拉取下文件呢?
我们可以通过如下 Git LFS 的 pull 命令进行拉取:
1 | $ git lfs pull |
> 如何获取历史版本
Git LFS 文件,每次提交时,都会将文件的索引记录在对应的 Git 的 commit 中。
所以只要通过 git checkout 就能恢复出对应的版本。
> 更复杂的场景
如果一个项目中,有很多用 LFS 管理的文件,有一些目录(或文件)不是通用的,但是另一些是必要的。那么如何设置在 clone 或 checkout 时只下载必要(默认)的 LFS 上的文件呢?需要时,再去下载另一部分文件。
可以用在 git config 中设置(要先保证该路径已被 git lfs track 追踪):
1 | $ git config -f .lfsconfig lfs.fetchexclude="*.mp4" |
这个命令会生成一个.lfsconfig文件(如果不存在),并在其中加入。
1 | [lfs] |
这样配置后,每次 checkout 和 clone 就会过滤掉当前目录下以 .mp4 的为结尾的文件。
那如果需要这些文件时,要怎么办呢?
可以通过上文中的 git lfs pull 进行复写,如:
1 | git lfs pull -X '' |
就会在拉取时,去除 fetchexclude 选项。
▎GitHub 中关于 LFS 的使用
GitHub 在 Billing 账单页面可以账号的 LFS Data 使用情况。
默认每个账号都有 1GB 的免费存储空间和 1GB 的免费带宽,可以通过购买,来添加更多的容量及带宽。