关于 Git LFS

用过的人都知道 git 作为分布式存储、版本控制和开发的工具,非常适合于管理纯文本,而对于图像和视频等富文本内容管理起来效率就不高了。直接 push 到 github 或 gitlab 上,大文件上传的速度不快,而且项目的总大小也受到限制,更为要命的是库会变得很臃肿。Git大文件存储工具lfs 很好的解决了这个问题,其原理相当于将项目中的大文件单独存储,而在原文件位置留下一个指针链接,从而让库中的内容保持为纯文本。当库中想添加大文件支持时,可以利用 lfs 工具,从而快速高效的管理项目。

如何应用 Git LFS

例如想跟踪项目中所有 psd 文档,可以在库中执行以下命令添加 git 大文件支持:

1
git lfs install

然后再执行:

1
git lfs track "*.psd"

若还要将一个文件夹 abc 下所有文件都视为大文件进行跟踪,那么执行以下命令:

1
git lfs track "abc/*"

这样会在项目文件夹根目录下产生一个 .gitattributes 文件,并且其中有以下内容:

*.psd filter=lfs diff=lfs merge=lfs -text
abc/* filter=lfs diff=lfs merge=lfs -text

一定要把 .gitattributes 添加进库中,这样在 push 到 github 或 gitlab 时,lfs 工具就能发挥作用。

解决 push 时出现的错误

按理一切应该都很美好,但笔者 push 到远端的时侯一直出错。如果你没有遇见这种问题,自然就不用继续往下看了。具体来说,在应用 LFS 后,push 时出现关于 dial tcp 的错误。错误提示如下:

batch response: Post https://gitlab.com/rulenuts/blog.git/info/lfs/objects/batch: proxyconnect tcp: dial tcp: lookup socks5 on 192.168.1.1:53: no such host
Uploading LFS objects:   0% (0/20), 0 B | 0 B/s, done

搜索一番,最终在 Stack Overflow 上找见了答案。原来是因为之前配置代理上网时,除了浏览器,还在终端和 git 添加了代理。浏览器和终端都没有问题,但 git 添加代理就是多此一举。在终端添加代理时,是在 .bashrc 和 .zshrc 中添加了新的一行:

1
export ALL_PROXY="socks5://127.0.0.1:1080"

这不是问题,毛病出在 git 上曾添加过代理:

1
2
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

通过以下命令取消设置就可以:

1
2
git config --global --unset http.proxy
git config --global --unset https.proxy