LFS/ LFS入门

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

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

  • Git仓库大了怎么办?

  • 文件大了不敢放?

  • 音视频担心占用空间?

工蜂Git支持大文件存储了!查阅Git LFS解决方案,快来将音频、图片、安装包、甚至数据文件加入版本控制。

快速开始,五步搞定

下载并安装Git LFS拓展

  • Windows / Linux 安装包

    GIT LFS下载:官网下载页

    注意: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

初始化Git LFS

执行命令

git lfs install

配置想要加入LFS托管的文件规则

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

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

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

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

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

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

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

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

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

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

git lfs fetch
git lfs checkout
# 或
git lfs pull

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

更多文档

为什么使用LFS?

历史问题

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

  • 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上的文件同样受到与其他项目文件相同级别的安全和权限控制。