简介

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/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

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

Github又悄悄升级了,这次的变化是大文件的存储方式的更多相关文章

  1. iNeuOS工业互联网操作系统,发布实时存储方式:实时存储、变化存储、定时存储,增加设备振动状态和电能状态监测驱动,v3.6.2

    目       录 1.      概述... 1 2.      平台演示... 2 3.      存储方式... 2 4.      设备状态和用电状态监控驱动... 3 1.   概述 本次升 ...

  2. 【RTOS】基于V7开发板的最新版uCOS-III V3.07.03程序模板,含MDK和IAR,支持uC/Probe,与之前版本变化较大

    模板下载: 链接:https://pan.baidu.com/s/1_4z_Lg51jMT87RrRM6Qs3g   提取码:2gns 对MDK的AC6也做了支持:https://www.cnblog ...

  3. github 创建网络仓库 ,使用git工具将本地文件上传/删除 --- 心得

    1.前言 使用  git做项目控制版本工具,当然,使用SVN也可以,但是,git让人感觉更先进一些,与GitHub结合,用起来很方便,服务端由官网控制. 而SVN分客户端和服务端,都是个人控制,因此, ...

  4. GitHub限制上传单个大于100M的大文件

    工作中遇到这个问题,一些美术资源..unitypackage文件大于100M,Push到GitHub时被拒绝.意思是Push到GitHub的每个文件的大小都要求小于100M. 搜了一下,很多解决办法只 ...

  5. Rails的静态资源管理(六)—— Asset Pipeline缓存存储方式、预处理、升级等

    官方文档:http://guides.ruby-china.org/asset_pipeline.html http://guides.rubyonrails.org/asset_pipeline.h ...

  6. Github上传大文件(超过100M)

    上传大文件(超过100M)到Github 笔者上传操作100M的文件到Github,结果在push的时候会自动终止.然后提示无法上传大文件,就算删除再提交也是报错. 于是,本人写这篇博客就是为了解决这 ...

  7. Github挂载大文件解决方案

    正常情况下,我们上传代码之类的文本文件,都不会太大,可以直接通过[Upload Files]选项直接上传. 但是这样的操作仅限文件大小在25MB以内. 如果你选择的文件超过25MB,那么Github会 ...

  8. github 上传大文件100MB姿势

    最新想把写一个一键配置Linux的脚本,所以就要安装一些软件咯,但是把有时候有源码安装比较好,而且有些东西直接传到Github会很方便,可又超过了100MB,Github正常情况下是不允许上传超过10 ...

  9. github下载大文件太慢/失败

    场景 github下载大文件,使用浏览器下载zip包到本地在下载到1G时失败, 使用 git clone ssh下载速度20k/s以下,已fq. 解决方法(亲测) 1.下载Github Desktop ...

随机推荐

  1. 学习jsp篇:jsp Cookie介绍

    这篇博客介绍下Cookie,JSP中比较重要的知识点Session,Cookie,表单数据,过滤器,文件上传.而Session和Cookie一般放在一起讲,在介绍cookie之前,要先介绍下Cooki ...

  2. Solution -「CF 1349D」Slime and Biscuits

    \(\mathcal{Description}\)   Link.   有 \(n\) 堆饼干,一开始第 \(i\) 堆有 \(a_i\) 块.每次操作从所有饼干中随机一块,将其随机丢到另外一堆.求所 ...

  3. MySQL数据备份/导出 创建用户及其删除

    Mysql DCL 创建用户 create user '用户名'@'localhost(本机访问)/%(通配符任何ip地址都可访问本机) 分配权限 grant 权限 on 数据库.表名 to '用户名 ...

  4. 前端程序员初步认识 docker

    初步认识 docker 为什么要学习 docker 有同学说他开发工作中有两大神器,一个是 vim 编辑器,另一个就是 Docker. 什么是 docker Docker 是一个开源的应用容器引擎. ...

  5. 《从零开始, 开发一个 Web Office 套件》系列博客目录

    这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 对应的Github r ...

  6. 【C#反射】动态创建类型实例

    转载自:https://www.cnblogs.com/dytes/archive/2012/06/29/2569488.html .NET中除了构造函数外,还有多种方式可以创建类型的实例.下面总结了 ...

  7. 怎么安装ExpressionTreeVisualizer for Visual Studio 2019

    1.下载  ExpressionTreeVisualizer   https://github.com/zspitz/ExpressionTreeVisualizer/releases    ,  解 ...

  8. Python 小数据池和代码块缓存机制

    前言 本文除"总结"外,其余均为认识过程:3.7.5: 总结: 如果在同一代码块下,则采用同一代码块下的缓存机制: 如果是不同代码块,则采用小数据池的驻留机制: 需要注意的是,交互 ...

  9. (转)oracle 数据库性能健康检查脚本

    转至:https://blog.csdn.net/cm_0205/article/details/100210526?utm_medium=distribute.pc_relevant_downloa ...

  10. 【NumPy】 之常见运算(np.around、np.floor、np.ceil、np.where)(转)

    原博客链接:https://blog.csdn.net/tz_zs/article/details/80775256 np.around: 四舍五入取整 n = np.array([-0.746, 4 ...