简介

github是大家罕用的代码管理工具,也被戏称为世界上最大的程序员交友网站,它的每次降级都会影响很多用户。在我的集体github网站上,之前在做JAVA NIO demo的时候上传了一个自制的大文件,最近对这个我的项目进行了一些批改,然而却上传不上github网站了,查看报错的起因,就是说我的项目中有一个大文件无奈上传,当初github提供了一个叫做Git Large File Storage (LFS)的工具来替换github中的大文件。

那么什么是LFS,咱们应该怎么应用LFS呢?一起来看看吧。

LFS和它的装置

LFS的全称是Git Large File Storage,能够将库中的大文件存储在近程服务器比方GitHub.com或者GitHub Enterprise上,在库中保留的是指向这些大文件的链接。

LFS装置起来比较简单,在mac上能够应用上面的brew命令:

brew install git-lfs

装置结束之后,须要把LFS和你的git账号关联起来:

git lfs install
留神lfs须要git版本>= 1.8.2

接下来咱们就能够欢快的应用LFS了。

LFS的应用

为了模仿github上的大文件,咱们能够在github上创立一个新的repository,而后执行上面的命令增加对应的内容:

git init .echo Hello World > README.mdgit add README.mdgit commit -m "Initial commit"

下面的代码提交到github上必定没有问题。

为了测试大文件,咱们能够应用dd命令创立一个256M的大文件如下:

dd if=/dev/urandom of=test.bin bs=1024 count=262144

在最新版本的github中,这个文件必定是上传不下来的,那么咱们应该怎么应用LFS呢?

lfs提供了上面的help命令:

$ git lfs help <command>$ git lfs <command> -h

这里咱们须要应用的是git lfs track命令如下:

git lfs track '*.bin'

下面的例子咱们应用的是通配符来匹配所有以bin结尾的文件。

当然,如果你想匹配下面的test.bin文件,也能够间接这样应用:

git lfs track 'test.bin'

这个命令的目标就是应用lfs来跟踪这些bin文件。你也能够应用track命令来列出所有被lfs的跟踪门路:

git lfs trackListing tracked paths    *.bin (.gitattributes)

咱们能够应用上面的命令来查看lsf具体的跟踪文件:

git lfs ls-files

然而因为你还没有commit下面创立的bin文件,所以这里是看不到的。

这些lfs的trace信息是存储在我的项目根目录下的.gitattributes中的。

咱们须要一并提交这个.gitattributes文件,以便所有checkout这个库的用户都能够通晓这个lfs服务。

当咱们把所有的文件都提交之后,再应用git lfs ls-files命令,能够看到相似上面的内容:

d05241dd24b * test.bin

阐明这个文件曾经增加到了lfs中。

从LFS中删除文件

下面咱们解说了如何将文件增加到LFS中进行跟踪,如果咱们不想应用LFS而是应用传统的git来管理文件该怎么办呢?

lfs提供了untrack的命令,它是和track相同的命令如下:

git lfs untrack "*file-type"

在untrack之后,还要记得从git cache中删除这个文件:

git rm --cached "*file-type"

而后从新增加这个文件到git,commit而后提交即可:

git add "*file-type"git commit -m "restore "*file-type" to git from lfs"

从LFS中拉取代码

从LFS中拉取代码和传统的一般的git拉取代码是统一的,间接应用git clone命令即可:

git clone https://github.com/username/test_repo.git destination_dir

转换历史数据到LFS

有时候咱们的文件曾经在repository中了,比方很多历史提交的文件,咱们想要将其转换称为LFS存储该怎么办呢?

lfs提供了一个migrate命令,用来进行文件的转存。

git lfs migrate

要想应用migrate命令,须要装置 Git LFS v2.2.1版本以上。

比方咱们想要migrate所有的bin文件,能够这样写:

git lfs migrate import --include="*.bin"

下面的命令只针对的是本地的branch,如果要migrate近程的branch,能够增加一个--include-ref参数,如下所示:

git lfs migrate import --include="*.bin" --include-ref=refs/heads/master 

而后强制提交库即可:

git push --force

最初,下面的命令尽管将历史的git objects 转换成了 lfs objects,然而本地的.git文件中并没有变动,所以还须要执行上面的命令对.git文件夹进行清理:

git reflog expire --expire-unreachable=now --allgit gc --prune=now

总结

如果你没有应用大文件,那么你不会用到lfs,如果你我的项目中有大文件,那么就参考这篇文章吧。

本文已收录于 http://www.flydean.com/07-git-largefile/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!