如果我们用git管理的项目中出现了一些大文件, 同时若其数量比较多, 而且更新又比较频繁, 那么当首次clone该项目时, 就会不可避免地将这些大文件的当前版本和历史所有版本的文件都下载下来, 虽然你很可能用不到这些历史文件, 但是却不得不为它们所占用的额外空间买单.
git lfs(large file storage)就很好地解决了这一问题. 通过将大文件替换为小指针的方式, 当你真正需要到这些大文件的时候, 它才会从本地或者远端的lfs缓存中下载这些大文件.
git lfs拥有本地lfs缓存和远端的lfs存储仓库.
当你add一个文件时, git lfs用一个指针替换了其中的内容, 并将文件存储在本地的git lfs缓存中
当你push一个文件时, 除过普通的文件会被正常push, 这些lfs文件也会被从本地lfs缓存传输到远端lfs存储仓库
当你checkout一个包含lfs 指针的提交的时候, 那么指针文件就将被本地lfs缓存中的备份, 或者lfs存储库中的备份替换
该指针当然也是一个文件, 内容如
version https://git-lfs.github.com/spec/v1
oid sha256:5b62e134d2478ae0bbded57f6be8f048d8d916cb876f0656a8a6d1363716d999
size 285
里面的第一行是一个指针文件规范URL, 第二行是对象id, 第三行是文件有多少字节.
可以通过网站 https://git-lfs.github.com/ 下载tar包, 比如git-lfs-linux-amd64-v2.9.0.tar.gz, 解压后运行
chmod 755 install.sh
sudo ./install.sh
git lfs install
你可以使用普通的git clone
命令来clone项目, 如果该项目中含有lfs文件, git会在clone的结尾帮你监测出所有的git lfs文件. 当然你也可以用git lfs clone
来加速, 并且git会等到checkout完成后在批量下载所有需要的lfs文件. 这可以显著减少http请求和进程的数量.
同样git pull
命令也是可以正常使用, 如果lfs文件有丢失, 那么可以通过git lfs pull
来下载当前丢失的lfs文件内容.
可以使用git lfs track
指令来指定追踪指定的文件为lfs文件, 指定方式与.gitignore
方式相同, 支持对单个或者通配的多个文件指定. 对于使用通配符指定时, 需要加上""
, 比如git lfs track "*.so"
, 否则该通配符会被shell扩展. 使用untrack
可以取消对某文件的追踪. 追踪的文件名单在.gitattributes
中可以找到. git lfs ls-files
可以查看所有的lfs文件, git lfs status
可以查看当前add的lfs文件
同样地, git push
就可以提交并推送lfs内容到远端仓库.