简介
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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!