Git大文件存储技术 git-lfs 使用,关联 Git Large File Storage

Git LFS(Git Large File Storage),即Git大文件存储技术。

在Git仓库中,对于非文本文件,如各种多媒体文件,软件制品文件,二进制文件等等,这些文件往往体积比较大,使用Git直接管理会导致仓库的体积迅速膨胀,进而导致Git的许多操作变慢,同时也影响仓库上传到远程端。

Git LFS相当于Git的一种插件式增强工具,简单讲,它是在Git仓库使用这些文件的 指针代替 实际文件,而把实际文件存储在远程端LFS服务器,同时在本地仓库中实时追踪这些文件的变动。

安装

1
2
# arch linux / manjaro
sudo pacman -S git-lfs
1
2
3
# debian / ubuntu
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs

配置

  1. 全局开启lfs,可以在 ~/.gitconfig 查看效果

    这一步是全局配置,所以执行一次即可,后续有其它仓库需要使用LFS,则不需要再次执行,除非中途取消了LFS配置。

    1
     git lfs install
    

    Tips: 运行 git lfs uninstall 即可取消LFS的全局配置

    • ~/.gitconfig 多了:
      1
      2
      3
      4
      5
       [filter "lfs"]
       clean = git-lfs clean -- %f
       smudge = git-lfs smudge -- %f
       process = git-lfs filter-process
       required = true
      
  2. 选择要用LFS追踪的文件

    这个命令会更改仓库中的 .gitattributes 配置文件(如果之前不存在这个文件,则会自动新建):

    1
    2
    3
    4
     $ git lfs track "*.svg"
     # 或者具体到某个文件
     $ git lfs track "2.png"
     $ git lfs track "example.lfs"
    
  3. 通过 git lfs ls-files 可以随时查看正在被LFS追踪的文件:

  4. 存并提交配置:

    1
    2
     $ git add .gitattributes
     $ git commit -m "add .gitattributes"
    

使用

查看 lfs 接管了那些文件

1
git lfs ls-files

git lfs untrack xxx 取消 LFS追踪

1
git lfs untrack "1.png"

加速 pull

如果一直一次更新了很多 LFS 文件,可以先 pull 是不下载 lfs 文件,而是 pull 完成后,用 git lfs pull 来单独高效下载。

1
git -c filter.lfs.smudge= -c filter.lfs.required=false pull && git lfs pull

配置 alias 简化命令:

1
2
$ git config --global alias.plfs "\!git -c filter.lfs.smudge= -c filter.lfs.required=false pull && git lfs pull"
$ git plfs

清理不再使用的 LFS 文件

清理本地库中的LFS文件: git lfs prune

但是,没有提供客户端命令,来删除远端 lfs 服务器上文件。。。只能依靠服务器提供的功能了。

gitea 服务器可以在 LFS 设置中,一个一个删文件,但是不支持全部删除,即不能情况项目的LFS文件库。如果实在太多,就把本地项目好好整理下,再把 gitea 服务器上的项目删除后重新创建,再从本地上传。

1
2
git push -u origin master
git lfs push --all origin

github 比较好,可以直接删除项目的LFS文件库,再重新 git lfs push 下。

reset –hard 之后有问题

如果要 reset –hard 要按照如下顺序:

1
2
3
4
git lfs uninstall
git reset --hard
git lfs install
git lfs pull

原理

Git LFS是基于Git的 .gitattributs 配置文件的特性,用 smudge过滤器基于 指针文件寻找大文件内容, 用 clean过滤器在对大文件改动时,创建指针文件的新版本。同时还用 pre-push钩子将大文件上传到Git LFS服务器, 即在 git-push时, 如果提交中包含被LFS跟踪的大文件,pre-push钩子会检测到,并执行上传Git LFS服务器的动作。

因此,如果一个仓库中包含LFS内容,但是在推送时不想推送这类文件,只要加上 –no-verify选项就行,即:

1
$ git push --no-verify

--no-verify 选项告诉 git push 完全跳过 pre-push 钩子。

前面提到被LFS管理的文件,本地仓库中保存的内容实际上是指针文件,其格式类似于下面这样:

1
2
3
4
5
6
$ git show HEAD:2.svg

version https://git-lfs.github.com/spec/v1
oid sha256:158213f90f8b27012034c6f58db63e1861b12aa122d98910de311bf1cb1e50a0
size 14651
(END)

version表示LFS的版本

oid表示文件对象的唯一hash值

size表示文件的大小