Git 是业界流行的分布式版本控制工具,本地仓库与远端仓库同样保存了全量的文件和变更历史,这样让代码协作变得简单和高效。但也正因为如此,Git针对大型文件(例如图片、视频或其他二进制文件)的版本控制,也会存在一些问题,主要有两点:
效率变慢:不管实际上用户是否使用到这些大文件的历史,都需要把每一个文件的每一个版本下载到本地仓库。毫无疑问,下载耗时的增加给用户带来了更多的等待时间。
空间变大:一个Git仓库存放的大型的文件越多,加之伴随着其关联提交不断增多,Git仓库会以非常快的速率膨胀,占用更多的磁盘空间。
这两方面的问题,让很多喜爱Git的用户非常的"难过",例如一些游戏开发工程师、设计工程师和文档管理者等等,他们每天面对的很多仓库都是这种情况。一方面,他们希望继续使用Git的版本控制和工作流能力,在另一方面Git仓库中大文件及其历史不断增多,导致工作效率越来越差。所以,针对上述的问题,Git LFS应运而生,是目前针对大文件场景下的主流的解决方案。
Git LFS (Large File Storage)
是一个开源的Git大文件版本控制的解决方案和工具集,工具自身是基于Golang进行实现,并在Github上开源。原理上是通过对Git客户端进行扩展的方式,从而集成并兼容了原生的Git客户端。Git LFS良好的设计,让用户感觉在对大文件处理过程中,与普通Git的使用方式上没有任何差别,也就是说,在使用方式上Git LFS对用户是完全透明的。
Git LFS 为了解决大文件托管的效率问题,提供了五大特性,抽象看来为:
git lfs install
命令,让当前环境支持全局的LFS配置# 让仓库支持LFS
$ git lfs install
Updated pre-push hook.
Git LFS initialized.
输入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还未替换
为了将以示例.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
为了让".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