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
|
配置
-
全局开启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
-
选择要用LFS追踪的文件
这个命令会更改仓库中的
.gitattributes
配置文件(如果之前不存在这个文件,则会自动新建):1 2 3 4
$ git lfs track "*.svg" # 或者具体到某个文件 $ git lfs track "2.png" $ git lfs track "example.lfs"
-
通过
git lfs ls-files
可以随时查看正在被LFS追踪的文件: -
存并提交配置:
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 文件
- refer
清理本地库中的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表示文件的大小