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/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
Github又悄悄升级了,这次的变化是大文件的存储方式的更多相关文章
- iNeuOS工业互联网操作系统,发布实时存储方式:实时存储、变化存储、定时存储,增加设备振动状态和电能状态监测驱动,v3.6.2
目 录 1. 概述... 1 2. 平台演示... 2 3. 存储方式... 2 4. 设备状态和用电状态监控驱动... 3 1. 概述 本次升 ...
- 【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 ...
- github 创建网络仓库 ,使用git工具将本地文件上传/删除 --- 心得
1.前言 使用 git做项目控制版本工具,当然,使用SVN也可以,但是,git让人感觉更先进一些,与GitHub结合,用起来很方便,服务端由官网控制. 而SVN分客户端和服务端,都是个人控制,因此, ...
- GitHub限制上传单个大于100M的大文件
工作中遇到这个问题,一些美术资源..unitypackage文件大于100M,Push到GitHub时被拒绝.意思是Push到GitHub的每个文件的大小都要求小于100M. 搜了一下,很多解决办法只 ...
- Rails的静态资源管理(六)—— Asset Pipeline缓存存储方式、预处理、升级等
官方文档:http://guides.ruby-china.org/asset_pipeline.html http://guides.rubyonrails.org/asset_pipeline.h ...
- Github上传大文件(超过100M)
上传大文件(超过100M)到Github 笔者上传操作100M的文件到Github,结果在push的时候会自动终止.然后提示无法上传大文件,就算删除再提交也是报错. 于是,本人写这篇博客就是为了解决这 ...
- Github挂载大文件解决方案
正常情况下,我们上传代码之类的文本文件,都不会太大,可以直接通过[Upload Files]选项直接上传. 但是这样的操作仅限文件大小在25MB以内. 如果你选择的文件超过25MB,那么Github会 ...
- github 上传大文件100MB姿势
最新想把写一个一键配置Linux的脚本,所以就要安装一些软件咯,但是把有时候有源码安装比较好,而且有些东西直接传到Github会很方便,可又超过了100MB,Github正常情况下是不允许上传超过10 ...
- github下载大文件太慢/失败
场景 github下载大文件,使用浏览器下载zip包到本地在下载到1G时失败, 使用 git clone ssh下载速度20k/s以下,已fq. 解决方法(亲测) 1.下载Github Desktop ...
随机推荐
- LAMP以及各组件的编译安装
LAMP以及各组件的编译安装 目录 LAMP以及各组件的编译安装 一.LAMP 1. LAMP概述 2. 各组件的主要作用 3. 平台环境的安装顺序 二.编译安装apache httpd 1. 关闭防 ...
- LeetCode随缘刷题之字符串转换整数
package leetcode.day_01_29; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 请你 ...
- nginx中的模块分类及常见核心模块有哪些
1.模块分类 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 .配置文件解析 .事件驱动机制 .进程管理等核心功能 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如 ...
- 使用rsync+inotify实现/www目录实时同步
一.实现bak-server 1.1安装rsync # yum -y install rsync 1.2修改配置文件 # vi /etc/rsyncd.conf #添加下面内容 uid=test gi ...
- Linux运维-常用操作-培训用例
一.服务器环境 Centos 7.9 二.常用连接工具(免费) 1.Finalshell 2.MobaXterm 3.Putty + WinSCP 三.Linux 系统目录结构 /bin :是 Bi ...
- HTTP缓存小结
介绍 提到页面优化,浏览器缓存必定是一个绕不过的话题,判断一个网站的性能最直观的就是看网页打开的速度,而提高网页反应速度的一个方式就是使用缓存.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟, ...
- Linux常用命令在Ubuntu 16下(个人笔记)
可以通过 tab键来补全提示命令或者目录,终端命令的格式: 命令 [-选项,多个选项可以结合写] [参数] , 大多数情况可以通过 ctrl c 退出命令 磁盘管理 pwd 查看当前所在目录 即:pr ...
- Python基础—编码(Day2)
一.字符编码 1.ASCII码:包含英文.数字.特殊字符,8位=1字节byte =1个字符,如: 0010 1010 ASCII码表里的字符总共有256个,前128个为常用的字符如运算符,后128个称 ...
- Linux性能优化之磁盘I/O调优
I/O指标已介绍,那么如何查看系统的这些指标呢? 一.根据工具查性能 二.根据性能找工具 三.磁盘I/O观察实例 iostat 是最常用的磁盘 I/O 性能观测工具,它提供了每个磁盘的 使用率 . I ...
- 练习推导一个最简单的BP神经网络训练过程【个人作业/数学推导】
写在前面 各式资料中关于BP神经网络的讲解已经足够全面详尽,故不在此过多赘述.本文重点在于由一个"最简单"的神经网络练习推导其训练过程,和大家一起在练习中一起更好理解神经网络训 ...