乐趣区

关于github:Github又悄悄升级了这次的变化是大文件的存储方式

简介

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.md
git add README.md
git 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 track

Listing 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 --all
git gc --prune=now

总结

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

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

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

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

退出移动版