一、使用场景
Git 主要用于代码版本控制,可以快速查看不同版本的代码内容的变更信息。但在实际使用过程中,代码仓库不仅会有纯文本的代码,可能会有 PSD 设计图、docx 文件、zip压缩包等二进制文件。
随着这些非文本的文件数量不断增多和多次版本迭代,Git 仓库的体积会迅速膨胀,并且 Git checkout 会变得非常缓慢。
Git LFS(Large File Storage)是为了专门支持大文件存储的 Git 扩展,它可以通过延迟下载大文件方式有效降低 Git 仓库的压力,带来的优势如下:
- 降低整个仓库的体积,大大提高首次 git clone 的速度;
- 只有执行 git checkout 分支和 commit 时,才会下载当前需要用到 LFS 文件,减少本地磁盘空间占用
值得一提的是,CODING 支持 Git LFS 扩展,开发过程中使用 Git LFS 所提交的大文件不占用团队自身的 Git 仓库容量,有助于节省团队代码存储资源。
二、基本原理
Git LFS 实现优化大文件存储的方式,是使用文件的指针文件替换原来的大文件,把大文件单独存储于 lfs 缓存目录中。
当我们需要用到这些大文件时,Git LFS 自动会根据指针,从缓存目录中检出对应真实文件。
1. 大文件提交仓库时
当我们把大文件添加 commit 到仓库时,git 的 commit hook 会调用 Git LFS 计算出文件的 hash,然后把文件内容替换对应的指针,并把真实的文件内容存放于 `.git/lfs/objects` 目录。
LFS 的指针文件体积非常小,通常小于 1KB,下文为一个图片的指针文件格式示例:
version https://git-lfs.github.com/spec/v1
oid sha256:8ffbc5bf63f5622d9241bb6b1f726c6314f071acee7c49a4aee1c637c85d8f87
size 4498040
2. 大文件推送到远端仓库时
执行 `git push` 命令时,Git 的 push hook 会调用 Git LFS,把指针文件会直接推送到 Git server,而另一个部分的真实的 LFS 文件会推送到 Git LFS 存储服务器(需要对应的 Git server 支持 LFS 功能)
3. 本地克隆仓库时
当我们通过 `git clone` 下载 Git 仓库时,首先下载得到一个体积较小的 Git 仓库,其中只包含代码文件和 LFS 指针文件。然后通过 Git 的 checkout hook 会调用 Git LFS,从上文提到的 Git LFS 存储服务器中下载当前分支所需的 LFS 大文件,而不需要下载 Git 仓库历史中所有文件。
如果切换到其他分支,Git 会快速切换为对应的指针文件,然后 Git LFS 通过 git checkout hook 检出本地 `.git/lfs/objects` 目录中对应的真实文件,并从 Git LFS 存储服务器中下载缺少的文件。
从上面的流程里可以看出,Git LFS 是在 Git 操作 `commit`、`push`、`checkhout` 的 hook 自动执行的,可以在正常 Git 命令无缝使用,没有太大的心智负担。
三、Cloud Studio 中使用 Git LFS
现在,Cloud Studio 开发空间已经集成了 Git LFS,可以便捷使用在线编辑器和命令行,可以快速地把前端图片添加到 Git 仓库中。下面是使用的流程:
1. 打开 Cloud Studio 开发空间,当前是一个静态网页项目,我们要在 static 文件夹下添加图片和 CSS
2. 现在把所有 png 图片设为 Git LFS 存储模式
在终端执行命令 `git lfs track "*.png"`,此时可以看到已经执行成功
代码语言:shell复制$ git lfs track "*.png"
Tracking "*.png"
同时还可以看到,根目录中生成了一个 `.gitattributes` 文件,这个文件是用与记录 Git LFS 配置
3. 然后,我们只需要执行 `git add .` 和 `git commit` 命令,把刚才所有图片、css 文件和 `.gitattributes` 提交 commit 到 Git 仓库中,并且自动把图片设置为 Git LFS 存储
4. 我们可以简单验证 Git LFS 是否有设置成功
通过命令 `git lfs ls-files`,可以列出所有 LFS 的文件。
从结果可见,刚才的图片已经设置为 Git LFS 存储模式。
当然,我们还可以从上文的 Git LFS 原理,从 LFS 缓存目录检查是否有对应文件。
通过 `git show` 命令,我们可以看到最新的 commit 提交的 `banner.png`,图片内容实际只有 3 行文本,其中包括协议 version、文件的 oid sha256 hash 和实际文件大小 size。
根据这个文件 oid 对应的 hash,可以找到真实文件在 `.git/lfs/objects` 的路径。
四、写在最后
Cloud Studio 会把一些常用的软件直接内置到我们的预置环境中,比如 Git LFS,让开发者无需自行安装就能开箱即用。对于一些不常用的软件,虽然 Cloud Studio 无法给我们预置,但是 Cloud Studio 的工作空间支持几乎所有文件目录的持久化能力,我们可以像本地环境一样,安装软件到 Cloud Studio 工作空间,且软件并被持久化下来,下次打开工作空间时,软件仍然存在,无需再次安装。除此之外,Cloud Studio 还提供了很多有价值又好玩的功能,比如代码协作、云部署、自定义模板等等。欢迎大家来使用 Cloud Studio 产品。
五、相关链接
- Git LFS 插件
- gitattributes 文档
- Cloud Studio 云开发平台
- CODING Git LFS 帮助文档