# 工蜂 Git 大文件存储方案 (LFS)

Git LFS 全名 Git Large File Storage,是 Github 带头在 2015 年推出的解决方案。

  • Git 仓库大了怎么办?
  • 文件大了不敢放?
  • 音视频担心占用空间?

工蜂 Git 支持大文件存储了!

查阅 Git LFS 解决方案,快来将音频、图片、安装包、甚至数据文件加入版本控制。

# 快速开始,五步搞定

# 1. 下载并安装 Git LFS 拓展
# Windows / Linux 安装包
  • GIT LFS 下载:官网 下载页
  • ps:Windows 用户的 Git 客户端 推荐使用 2.16+的版本,如果版本太低可能无法使用 lfs
# Windows / Cygwin 安装

根据安装向导安装下载的 .exe 包后,启动一个新的命令行窗口(以使包含 git-lfs 命令的目录能被加载进 PATH,并执行以下命令:

git lfs install
# BSD / Linux

下载完压缩包后,打开命令行进入下载文件所处的目录,并执行以下命令:

tar xf git-lfs-*.tar.gz
cd git-lfs-*
sudo ./install.sh

也可使用内置支持 Git LFS 的客户端,例如 SourceTree

# Mac
brew install git-lfs
git lfs install
# 2. 初始化 Git LFS

执行命令

git lfs install
# 3. 配置想要加入 LFS 托管的文件规则

例如,添加目录下所有的.psd 和.a 文件,使其被 LFS 托管

git lfs track "*.psd"
git lfs track "*.a"

或者直接编辑 ".gitattributes" 文件

注意 ".gitattributes"需要加入到 git 库中,LFS 文件才能被其他人识别

# 4. 只获取仓库本身而不获取任何 LFS 对象

如果自己的相关工作不涉及到被 Git LFS 所管理的文件的话,可以选择只获取 Git 仓库自身的内容,而完全跳过 LFS 对象的获取。

GIT_LFS_SKIP_SMUDGE=1 git clone https://git.tencent.com/test/test.git
# 或
git -c filter.lfs.smudge= -c filter.lfs.required=false clone https://git.tencent.com/test/test.git

注意 GIT_LFS_SKIP_SMUDGE=1 及 git -c filter.lfs.smudge= -c filter.lfs.required=false 同样使用于其他 git 命令,如 checkout, reset 等

# 5. 获取当前 commit 下包含的 LFS 对象的当前版本

如果起初获取代码时,没有一并获取 LFS 对象,而随后又需要这些被 LFS 管理的文件时,可以单独执行 LFS 命令来获取并签出 LFS 对象:

git lfs fetch
git lfs checkout
# 或
git lfs pull

经过以上几步,您的 psd 和 a 文件就会在 push 时自动向 LFS 服务器提交了。

# 更多文档

# 使用 LFS 托管大文件 - 实战篇
# 使用 LFS 托管大文件-Track 规则

# 为什么使用 LFS?

# 历史问题

存储和管理大型文件的版本,是一个由来已久的难题。 由于需要记录全部历史版本,在托管比较大的文件时,以往的代码仓库往往不太给力。

  • SVN 如 SVN,系统会把每次提交的文件差异存储下来,当用户新拉取一个文件时,需要取得所有的差异集,并把他们拼装相加,再返回一个完整的文件给用户。如果仅是满足代码文件(文本)的需要,这种机制是十分顺畅的。但当图片、音视频、数据集、程序包、二进制文件时,状况就会开始恶化。如果版本数量较少,计算机凭借优异的性能,可以做到用户无感知。但当版本较多,文件很大时,CPU 的计算资源会逐渐成为瓶颈,其体现就是 SVN CO 速度越来越慢。慢并非是网络传输造成的,而是版本数、碎片、文件大小共同作用,使 CPU 和 IO 到达瓶颈带来的。

  • Git Git 虽然没有 SVN 合并差异计算的问题,相比 SVN 利用空间替换了 CPU 的计算时间。但由于分布式要求,客户端往往会克隆整个仓库来本地,也包含了文件历史。如果历史版本较多,用户就要等每个版本从网络传输到本地。因此,用户克隆的时间包含了下载所有历史版本到本地的时间。如果文件比较大,会变成所有人的梦魇。

# LFS 的优点

用 Git LFS 管理二进制文件后,将获取最优异的能效比。

  • 它使用简单,只需在客户端安装并执行一次配置命令,之后像往常一样操作即可,保留一贯的使用习惯。
  • 它效率高,只在需要的时候才下载版本文件,不会下载版本历史。
  • 它保障强,所有历史记录均会在服务端保存。
  • 它和原生 Git 巧妙结合,没有安装 LFS extension 的用户,仅仅取不到对应的大文件而已,并不影响版本库的日常操作。

# LFS 的原理

向服务器提交时,Git LFS 把文件上传到一个专用的存储区域,同时保存一份指针(文本文件)在原有的版本库中。 当另外一个人拉取,他将首先拉取到指针,此时 Git LFS 解析这个指针,并把实际文件内容取回到本地。 文件每有一个新版本时,就会创建一个新指针,并向服务器上传,这样服务器上就有了多个历史版本,从而实现了基本的版本管理。 在腾讯工蜂 Git 服务器上,LFS Server 上的文件同样受到与其他项目文件相同级别的安全和权限控制。

lastUpdate: 4/4/2023, 7:25:28 PM