转载自:https://cloud.tencent.com/developer/article/1010589

1、Git LFS 介绍

Git 大文件存储(Large File Storage,简称LFS)目的是更好地把大型二进制文件,比如音频文件、数据集、图像和视频等集成到 Git 的工作流中。我们知道,Git 存储二进制效率不高,因为它会压缩并存储二进制文件的所有完整版本,随着版本的不断增长以及二进制文件越来越多,这种存储方案并不是最优方案。而 LFS 处理大型二进制文件的方式是用文本指针替换它们,这些文本指针实际上是包含二进制文件信息的文本文件。文本指针存储在 Git 中,而大文件本身通过HTTPS托管在Git LFS服务器上。

2、环境、软件准备

本次演示环境,我是在虚拟机Linux Centos7上操作,以下是安装的软件及版本:

  1. Docker:version 1.12.6
  2. Git:version 2.10.1
  3. GitLab: GitLab Community Edition 9.1.4
  4. Git-lfs: version 2.2.1

注意:GitLab 这里我使用基于 Docker 安装,所以需要先安装一下 Docker,后边演示 Git-lfs 操作,需要本地先安装 Git,这里 Git、GitLab、Docker 的安装忽略,着重讲一下 Git lfs。

3、Git LFS 安装

客户端 Git LFS 安装步骤很简单,有好几种安装方式:

1、去 Git LFS 官网下载最新版安装包安装

$ wget https://github.com/git-lfs/git-lfs/releases/download/v2.2.1/git-lfs-darwin-amd64-2.2.1.tar.gz
$ tar -zxvf git-lfs-darwin-amd64-2.2.1.tar.gz
$ cd git-lfs-2.2.1
$ ./install.sh

2、 brew 安装方式

$ brew install git-lfs

3、直接 git 命令安装

$ git lfs install

注意:Git LFS客户端版本必须 >= 1.0.1,这里我们安装的版本是2.2.1。

4、GitLab LFS 的配置

为了更好的服务社区,满足版本大型文件的需求,GitLab 宣布支持 Git LFS,现在已经包括在 GitLab.com,GitLab 社区版本和 GitLab 企业版本。但是 GitLab 对 Git LFS 支持需要满足:

  1. Git LFS is supported in GitLab starting with version 8.2. (gitlab版本需要 >= 8.2)
  2. Git LFS must be enabled under project settings (必须在项目设置中开启LFS)
  3. Users need to install Git LFS client version 1.0.1 and up (本地git lfs客户端版本 >= 1.0.1)

4.1 配置 GitLab 是否开启 Git LFS 以及修改默认 LFS 存储路径。

新版 GitLab 默认是开启 Git LFS 支持,默认存储路径为:{gitlab_rails['shared_path']}/lfs-objects。若我们想关闭 Git LFS 或者修改存储路径的话,可以通过下边方法修改:

1、GitLab 以 Omnibus packages 混合包安装

修改/etc/gitlab/gitlab.rb

gitlab_rails['lfs_enabled'] = true | false
#默认位置:`/var/opt/gitlab/gitlab-rails/shared/lfs-objects`
gitlab_rails['lfs_storage_path'] = "/mnt/storage/lfs-objects"

2、GitLab 以 source 源码安装

修改config/gitlab.yml:

lfs:
enabled: false | true
storage_path: /mnt/storage/lfs-objects

4.2 GitLab 的 Project 设置开启 LFS

在 GitLab 中设置项目的 LFS 开启|关闭:project -> setting -> general -> project settings -> LFS enabled/disabled。具体设置看4.3.1中的图。

4.3 示例操作

为了更好的演示操作,我们新建两个项目,分别为 demo1 和 demo2 ,demo1 不开启 LFS 支持,demo2 开启 LFS 支持,然后我们分别进行一下操作,看看他们区别:

1、先设置项目 LFS 开启|关闭

2、Git操作

我们先分别提交稍大一些的文件到各个项目中

$ git clone http://wanyang3@10.236.65.134/scm/demo1.git
$ cd demo1
$ cp ~/Downloads/soft/apache-tomcat-8.0.36.zip ./
$ git add .
$ git commit -m "test no lfs"
$ git push origin master $ git clone http://wanyang3@10.236.65.134/scm/demo2.git
$ cd demo2
$ cp ~/Downloads/soft/apache-tomcat-8.0.36.zip ./
$ git lfs track "*.zip" #设置存储到 LFS 的文件扩展名,这里我设置 .zip 后缀格式的文件
$ cat .gitattributes #自动生成的文件,需一并提交到 Git,否则 Clone 项目的时候 Git LFS 不起作用
* .zip filter=lfs diff=lfs merge=lfs -text
$ git add .
$ git commit -m "test with lfs"
$ git push origin master

注意:我们对比下使用 LFS 和不使用 LFS 的项目操作,只需要在想加入的大文件时,增加文件后缀,执行git lfs track "*.zip"·一条语句即可,并未产生额外的 Git 指令,还是很容易上手的。

然后,我们在分别 Clone 各个项目

$ git clone http://wanyang3@10.236.65.134/scm/demo1.git
Cloning into 'demo1'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done. $ git clone http://wanyang3@10.236.65.134/scm/demo2.git
Cloning into 'demo2'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 7 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (7/7), done.
Downloading apache-tomcat-8.0.36.zip (9.9 MB)
或者
$ git lfs clone http://wanyang3@10.236.65.134/scm/demo2.git
Cloning into 'demo2'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 7 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (7/7), done.
Git LFS: (1 of 1 files) 9.40 MB / 9.40 MB

注意:

  1. 这里我们可以看出,使用 LFS 的项目,Clone 时会提示 Downloading … 或者 Git LFS … ,当 Push 的文件更大一些的时候,我们会发现使用 LFS 的项目复制和提取文件会更快一些。
  2. 这里可使用git clone ...或者使用git lfs clone ...即指定该项目使用 lfs 均可,具体 git lfs 其他命令,可参考git lfs help命令。
  3. 开启 LFS 的项目,当 Push 大文件之后,在 GitLab Web 页面上是删除不了的,需要通过接口删除该文件。

参考资料:

GitLab 之 Git LFS 大文件存储的配置的更多相关文章

  1. php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项

    php 上传大文件主要涉及配置 upload_max_filesize 和post_max_size两个选项   今天在做上传的时候出现一个非常怪的问题,有时候表单提交可以获取到值,有时候就获取不到了 ...

  2. Git 提交大文件提示 fatal: The remote end hung up unexpectedly

    使用gitlab搭建的git server,如果直接使用http的方式去提交的话,提交小文件不会有问题,但是提交大文件时,会出错: fatal: The remote end hung up unex ...

  3. git 突破大文件上传限制

    1.安装 lfs: git lfs install 2.跟踪大文件:git lfs track "file.suffix" 3.添加配置文件:git add .gitattribu ...

  4. Git 删除大文件的方法

    git 仓库中删除历史大文件   git 仓库中删除历史大文件 在git中增加了一个很大的文件,而且被保存在历史提交记录中,每次拉取代码都很大,速度很慢.而且用删除 提交历史记录的方式不是很实际. 以 ...

  5. mongoDB 大文件存储方案, JS 支持展示

    文件存储 方式分类 传统方式 存储路径 仅存储文件路径, 本质为 字符串 优点: 节省空间 缺点: 不真实存储在数据库, 文件或者数据库发送变动需要修改数据库 存储文件本身 将文件转换成 二进制 存储 ...

  6. 解决git commit 大文件推送失败

    //查找大文件 git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5 //根据上面查找到的hash值,筛选文 ...

  7. mongo 固定集合,大文件存储,简单优化 + 三招解决MongoDB的磁盘IO问题

    1.固定集合 > db.createCollection(, max:});//固定集合 必须 显式创建. 设置capped为true, 集合总大小xxx字节, [集合中json个数max] { ...

  8. ios大文件存储

    I am using Erica Sadun's method of Asynchronous Downloads (link here for the project file: download) ...

  9. Git Push大文件报错后如何撤回

    昨晚在提交一个项目代码时,不小心把数据库备份文件也一起Commit了:到最后Push的时候报错了.最后弄了半天解决了,在此记录下. 如下图,文件有108M. 项目放在第三方托管平台上,根据提示查看了原 ...

随机推荐

  1. 5-12 Kafka 消息队列

    消息队列(Message Queue) 软件下载 软件下载 MQ_Blog Dubbo远程调用的性能问题 Dubbo调用在微服务项目中普遍存在 这些Dubbo调用都是同步的 "同步" ...

  2. CF1709A Three Doors 题解

    题意 有三扇门,每扇门都有一把钥匙与该门上的数字相对应,若数字一样就可以打开. 其中有两扇门后有钥匙,一扇门后为空. 现拥有一把钥匙 \(x\),给出三扇门后的钥匙(若为 \(0\) 即门后没有钥匙) ...

  3. CentOS 定时计划任务设置

    一.安装crontab服务并设置开机自启 yum install crontabs (centos默认就会带,一般不需要安装) systemctl enable crond (设为开机启动) syst ...

  4. Modbus转BACnet IP网关

    BACnet是楼宇自动化和控制网络数据通信协议的缩写.它是为楼宇自动化网络开发的数据通信协议   根据1999年底互联网上楼宇自动化网络的信息,全球已有数百家国际知名制造商支持BACnet,包括楼宇自 ...

  5. PerfView专题 (第一篇):如何寻找热点函数

    一:背景 准备开个系列来聊一下 PerfView 这款工具,熟悉我的朋友都知道我喜欢用 WinDbg,这东西虽然很牛,但也不是万能的,也有一些场景他解决不了或者很难解决,这时候借助一些其他的工具来辅助 ...

  6. Mybatis框架--优化过程

    0. 原代码预览 简单实现在数据库中插入数据 public void testInsert() throws IOException { //获取核心配置文件的输入流 InputStream is = ...

  7. pre 预格式化文本标签

    预格式化指的是保留文本在源代码中的格式,页面中显示的和源代码中的效果完全一致.例如,原封不动地保留文本中的空白.空格.制表符等. 除非使用<pre/>标签包裹的文本,否则,浏览器不显示和源 ...

  8. dentry的引用计数不对导致的crash

    [17528853.189372] python invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=-998[17528853.189 ...

  9. [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习)

    [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习) 在C#中,存在常见的九种集合类型:动态数组ArrayList.列表List.排序列表SortedList.哈希表HashTa ...

  10. html页面嵌套其他网站页面的方法

    直接上代码:html页面嵌套其他网站页面的方法 <div> <!--第一种:使用object标签--> <object type="text/html" ...