Git 碰到大文件的困境
Git 是业界流行的分布式版本控制工具,本地仓库与远端仓库同样保存了全量的文件和变更历史,这样让代码协作变得简单和高效。但也正因为如此,Git针对大型文件(例如图片、视频或其他二进制文件)的版本控制,也会存在一些问题,主要有两点:
效率变慢:不管实际上用户是否使用到这些大文件的历史,都需要把每一个文件的每一个版本下载到本地仓库。毫无疑问,下载耗时的增加给用户带来了更多的等待时间。
空间变大:一个Git仓库存放的大型的文件越多,加之伴随着其关联提交不断增多,Git仓库会以非常快的速率膨胀,占用更多的磁盘空间。
这两方面的问题,让很多喜爱Git的用户非常的"难过",例如一些游戏开发工程师、设计工程师和文档管理者等等,他们每天面对的很多仓库都是这种情况。一方面,他们希望继续使用Git的版本控制和工作流能力,在另一方面Git仓库中大文件及其历史不断增多,导致工作效率越来越差。所以,针对上述的问题,Git LFS应运而生,是目前针对大文件场景下的主流的解决方案。
什么是Git LFS大文件存储?
Git LFS (Large File Storage)
是一个开源的Git大文件版本控制的解决方案和工具集,工具自身是基于Golang进行实现,并在Github上开源。原理上是通过对Git客户端进行扩展的方式,从而集成并兼容了原生的Git客户端。Git LFS良好的设计,让用户感觉在对大文件处理过程中,与普通Git的使用方式上没有任何差别,也就是说,在使用方式上Git LFS对用户是完全透明的。
如何使用 Git LFS
Git LFS 为了解决大文件托管的效率问题,提供了五大特性,抽象看来为:
- 更大:支持GB级别的大文件版本控制
- 更小:让Git仓库空间占用减小
- 更快:仓库的克隆和拉取更快
- 透明:Git使用上对用户完全透明
- 兼容:权限控制上完全兼容(兼容Codeup权限控制)
下载Git LFS
- Linux Debian 和 RPM packages:https://packagecloud.io/github/git-lfs/install
- Mac: brew install git-lfs
- Windows:目前lfs已经集成在了Git for Windows 中,直接下载和使用最新版本的Windows Git即可。
- 直接下载二进制包:https://github.com/git-lfs/git-lfs/releases
- 依据源码构建:https://github.com/git-lfs/git-lfs
安装 Git LFS
- 如果你选择使用二进制包下载后安装,直接执行解压后的./install.sh脚本即可,这个脚本会做两个事情:
- 在$PATH中安装Git LFS的二进制可执行文件
- 执行
git lfs install
命令,让当前环境支持全局的LFS配置
# 让仓库支持LFS
$ git lfs install
Updated pre-push hook.
Git LFS initialized.
查看Git LFS相关的Hook(使用时可跳过)*
输入tree命令
下载 tree 命令的 二进制包,安装 tree 命令工具
打开进入 Tree for Windows 页面,选择下载 Binaries zip 文件。
解压压缩包,找到压缩包内的 bin 目录,将 bin 目录下的 tree.exe 复制
找到 安装Git的文件夹,找到该文件夹下的usr\bin 目录,将 tree.exe 粘贴到该目录下,安装即完成
测试tree是否安装成功
进入Git Bash,输入tree -L 1命令,显示结果如下:
$tree .git/hooks/
.git/hooks/
|-- applypatch-msg.sample
|-- commit-msg.sample
|-- fsmonitor-watchman.sample
|-- post-checkout
|-- post-commit
|-- post-merge
|-- post-update.sample
|-- pre-applypatch.sample
|-- pre-commit.sample
|-- pre-merge-commit.sample
|-- pre-push
|-- pre-push.sample
|-- pre-rebase.sample
|-- pre-receive.sample
|-- prepare-commit-msg.sample
|-- push-to-checkout.sample
|-- sendemail-validate.sample
`-- update.sample
0 directories, 18 files
此时Git LFS相关的Hook还未替换
配置Git LFS
为了将以示例.bigfile
后缀结尾的文件使用Git LFS进行存储,需要执行track命令建立追踪:
$git lfs track "*.bigfile"
Tracking "*.bigfile"
使用 lfs track 命令时,"*.bigfile"的双引号非常重要,否则将影响pattern的文件匹配功能
同理,如需跟踪其他后缀的文件,如.jpg,可以写为git lfs track "*.jpg"
。
执行git lfs track(不带任何参数)
,可以查看当前已跟踪的Git LFS File 类型:
$git lfs track
Listing tracked patterns
*.bigfile (.gitattributes)
Listing excluded patterns
track 命令实际上是修改了仓库中的.gitattributes文件,将该文件add添加到暂存区。
$git add .gitattributes
我们可以通过以下命令查看文件相关变动(使用时可略过):
$git diff --cached
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..c441ad2
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+*.bigfile filter=lfs diff=lfs merge=lfs -text
让 Git LFS 配置生效
为了让".bigfile"的配置生效,需要将.gitattributes文件进行提交:
···
$git commit -m "Add ".bigfile" LFS config "
[master (root-commit) d052478] Add “.bigfile" LFS config
1 file changed, 1 insertion(+)
create mode 100644 .gitattributes
$git log --oneline
d052478 (HEAD -> master) Add ".bigfile” LFS config
···
大文件上传
通过上述配置即可将.bigfile后缀命中了.gitattributes中设置的".bigfile"的文件格式,所以将做为 LFS 文件处理。
接下来,将.bigfile的变更提交并推送到远端
至此,这个仓库中.bigfile的文件已经成功使用LFS进行管理,而其他文件使用Git进行管理。
参考资料
Git LFS 支持大文件存储
大仓库管理
Git LFS 使用注意事项
LFS 迁移指南
Windows下安装tree