通过这系列的前六篇文章,我们已经学会使用 Git 来对文本文件进行版本控制的管理。我们不禁要问,还有二进制文件呢,也可进行进行版本控制吗?答案是肯定的,Git 已经有了可以处理像多媒体文件这样的二进制大对象块(blob)的扩展。因此,今天我们会学习使用 Git 来管理所谓的二进制资产。

似乎大家都认可的事就是 Git 对于大的二进制对象文件支持得不好。要记住,二进制大对象与大文本文件是不同的。虽然 Git 对大型的文本文件版本控制毫无问题,但是对于不透明的二进制文件起不了多大作用,只能把它当作一个大的实体黑盒来提交。

设想这样的场景,有一个另人兴奋的第一人称解密游戏,您正在为它制作复杂的 3D 建模,源文件是以二进制格式保存的,最后生成一个 1GB 大小的的文件。您提交过一次,在 Git 源仓库历史中有一个 1GB 大小的新增提交。随后,您修改了下模型人物的头发造型,然后提交更新,因为 Git 并不能把头发从头部及模型中其余的部分离开来,所以您只能又提交 1GB 的量。接着,您改变了模型的眼睛颜色,提交这部分更新:又是 GB 级的提交量。对一个模型的一些微小修改,就会导致三个 GB 级的提交量。对于想对一个游戏所有资源进行版本控制这样的规模,这是个严重的问题。

不同的是如 .obj 这种格式的文本文件,和其它类型文件一样,都是一个提交就存储所有更新修改状态,不同的是 .obj 文件是一系列描述模型的纯文本行。如果您修改了该模型并保存回 .obj 文件,Git 可以逐行读取这两个文件,然后创建一个差异版本,得到一个相当小的提交。模型越精细,提交就越小,这就是标准的 Git 用例。虽然文件本身很大,但 Git 使用覆盖或稀疏存储的方法来构建当前数据使用状态的完整描述。

然而,不是所有的都是纯文本的,但都要使用 Git,所以需要解决方案,并且已经出现几个了。

OSTree 开始是作为 GNOME 项目出现的,旨在管理操作系统的二进制文件。它不适用于这里,所以我直接跳过。

Git 大文件存储(LFS) 是放在 GitHub 上的一个开源项目,是从 git-media 项目中分支出来的。git-media 和 git-annex 是 Git 用于管理大文件的扩展。它们是对同一问题的两种不同的解决方案,各有优点。虽然它们都不是官方的项目,但在我看来,每个都有独到之处:

  • git-media 是集中模式,有一个公共资产的存储库。你可以告诉 git-media 大文件需要存储的位置,是在硬盘、服务器还是在云存储服务器,项目中的每个用户都将该位置视为大型文件的中心主存储位置。
  • git-annex 侧重于分布模式。用户各自创建存储库,每个存储库都有一个存储大文件的本地目录.git/annex。这些 annex 会定期同步,只要有需要,每个用户都可以访问到所有的资源。除非通过 annex-cost 特别配置,否则 git-annex 优先使用本地存储,再使用外部存储。

对于这些,我已经在生产中使用了 git-media 和 git-annex,那么下面会向你们概述其工作原理。

git-media

git-media 是使用 Ruby 语言开发的,所以首先要安装 gem(LCTT 译注:Gem 是基于 Ruby 的一些开发工具包)。安装说明在其网站上。想使用 git-meida 的用户都需要安装它,因为 gem 是跨平台的工具,所以在各平台都适用。

安装完 git-media 后,你需要设置一些 Git 的配置选项。在每台机器上只需要配置一次。

  1. $ git config filter.media.clean "git-media filter-clean"
  2. $ git config filter.media.smudge "git-media filter-smudge"

在要使用 git-media 的每个存储库中,设置一个属性以将刚刚创建的过滤器结合到要您分类为“媒体media”的文件类型里。别被这种术语混淆。一个更好的术语是“资产”,因为“媒体”通常的意思是音频、视频和照片,但您也可以很容易地将 3D 模型,烘焙和纹理等归类为媒体。

例如:

  1. $ echo "*.mp4 filter=media -crlf" >> .gitattributes
  2. $ echo "*.mkv filter=media -crlf" >> .gitattributes
  3. $ echo "*.wav filter=media -crlf" >> .gitattributes
  4. $ echo "*.flac filter=media -crlf" >> .gitattributes
  5. $ echo "*.kra filter=media -crlf" >> .gitattributes

当您要暂存stage这些类型的文件时,文件会被复制到 .git/media 目录。

假设在服务器已经有了一个 Git 源仓库,最后一步就告诉源仓库“母舰”所在的位置,也就是,当媒体文件被推送给所有用户共享时,媒体文件将会存储的位置。这在仓库的 .git/config 文件中设置,请替换成您的用户名、主机和路径:

  1. [git-media]
  2. transport = scp
  3. autodownload = false #默认为 true,拉取资源
  4. scpuser = seth
  5. scphost = example.com
  6. scppath = /opt/jupiter.git

如果您的服务器上 SSH 设置比较复杂,例如使用了非标准端口或非默认 SSH 密钥文件的路径,请使用.ssh/config 为主机设置默认配置。

git-media 的使用和普通文件一样,可以把普通文件和 blob 文件一样对待,一样进行 commit 操作。操作流程中唯一的不同就是,在某些时候,您应该将您的资产(或称媒体)同步到共享存储库中。

当要为团队发布资产或自己备份资料时,请使用如下命令:

  1. $ git media sync

要用一个变更后的版本替换 git-media 中的文件时(例如,一个已经美声过的音频文件,或者一个已经完成的遮罩绘画,或者一个已经被颜色分级的视频文件),您必须明确的告诉 Git 更新该媒体。这将覆盖 git-media 不会复制远程已经存在的文件的默认设置:

  1. $ git update-index --really-refresh

当您团队的其他成员(或是您本人,在其它机器上)克隆本仓库时,如果没有在 .git/config 中把autodownload 选项设置为 true 的话,默认是不会下载资源的。但 git-media 的一个同步命令 git media sync 可解决所有问题。

git-annex

git-annex 的处理流程略微的有些不同,默认是使用本地仓库的,但基本的思想都一样。您可以从你的发行版的软件仓库中安装 git-annex,或者根据需要从该网站上下载安装。与 git-media 一样,任何使用 git-annex 的用户都必须在其机器上安装它。

其初始化设置比 git-media 都简单。运行如下命令,其中替换成您的路径,就可以在您的服务器上创建好裸存储库:

  1. $ git init --bare --shared /opt/jupiter.git

然后克隆到本地计算机,把它标记为 git-annex 的初始路径:

  1. $ git clone seth@example.com:/opt/jupiter.clone
  2. Cloning into 'jupiter.clone'...
  3. warning: You appear to have clonedan empty repository.
  4. Checking connectivity... done.
  5. $ git annex init "seth workstation"
  6. init seth workstation ok

不要使用过滤器来区分媒体资源或大文件,您可以使用 git annex 命令来配置归类大文件:

  1. $ git annex add bigblobfile.flac
  2. add bigblobfile.flac
  3. (checksum) ok
  4. (Recording state in Git...)

跟普通文件一样进行提交操作:

  1. $ git commit -m 'added flac source for sound fx'

但是推送操作是不同的,因为 git annex 使用自己的分支来跟踪资产。您首次推送可能需要 -u 选项,具体取决于您如何管理您的存储库:

  1. $ git push -u origin master git-annex
  2. To seth@example.com:/opt/jupiter.git
  3. * [new branch] master -> master
  4. * [new branch] git-annex -> git-annex

和 git-media 一样,普通的 git push 命令是不会拷贝资料到服务器的,仅仅只是发送了相关的消息,要真正共享文件,需要运行同步命令:

  1. $ git annex sync --content

如果别人已经提交了共享资源,您需要拉取它们,git annex sync 命令将提示您要在本地检出你本机没有,但在服务器上存在的资源。

git-media 和 git-annex 都非常灵活,都可以使用本地存储库来代替服务器,所以它们也常用于管理私有的本地项目。

Git 是一个非常强大和扩展性非常强的系统应用软件,我们应该毫不犹豫的使用它。现在就开始试试吧!

原文发布时间为:2017-11-29

本文来自云栖社区合作伙伴“Linux中国”

Git 系列(七):使用 Git 管理二进制大对象相关推荐

  1. Git系列(七):使用Git管理二进制大对象

    通过这系列的前六篇文章,我们已经学会使用 Git 来对文本文件进行版本控制的管理.我们不禁要问,还有二进制文件呢,也可进行进行版本控制吗?答案是肯定的,Git 已经有了可以处理像多媒体文件这样的二进制 ...

  2. Git系列(五):Git Flow

    Git系列目录 Git系列(一):Git安装后配置用户名.邮箱 Git系列(二):Git创建本地仓库及对文件进行操作 Git系列(三):Git版本管理 Git系列(四):本地仓库关联远程仓库(将本地仓 ...

  3. 计算机术语blob是什么东西?( binary large object,二进制大对象,是一个可以存储二进制文件的容器)(典型的BLOB是一张图片或一个声音文件)

    看hikflow_demo源码,搞不清楚blob是什么玩意,, 查了一下: BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器. 在计算机中,BLOB常 ...

  4. Git系列一之安装管理

    1.Git安装部署 Git是分布式的版本控制系统,我们只要有了一个原始Git版本仓库,就可以让其他主机克隆走这个原始版本仓库,从而使得一个Git版本仓库可以被同时分布到不同的主机之上,并且每台主机的版 ...

  5. Git系列教程(四)——git分支管理

    Git 分支管理 一.创建与合并分支 二.删除分支 三.分支冲突 四.分支管理策略 五.Bug分支 六.总结 一.创建与合并分支 什么是分支?有了分支,你创建了一个属于你自己的分支,别人看不到,还继续 ...

  6. 【git系列005】git分支学习

    GIT分支 一.Git 分支模型 经典 Git-Flow 两个常驻分支(master & develop),代码开发都在临时分支上进行.有少少复杂度,需要做好日常管理(如及时删除已合并的临时分 ...

  7. 玩转GIT系列之【git的分支操作(查看分支/切换分支/新建分支/删除分支)】

    一.查看分支 1.查看全部分支 git branch -a 2.查看本地分支 git branch -l 3.查看远程分支 git branch -r 二.切换分支 假设本地当前处于master分支下 ...

  8. 玩转GIT系列之【git pull和git fetch的区别】

    大家都知道,git中从远程的分支获取最新的版本到本地有2个命令,git pull和git fetch.但是,这两个命令究竟有什么区别?使用时候该怎么选择呢?很多人不是很清楚,我自己也不是很清楚.今天就 ...

  9. java的知识点45——CLOB 存储大量的文本数据与 BLOB 二进制大对象

    CLOB(Character Large Object) 用于存储大量的文本数据 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的. 测试CLOB 文本大对象的使用   ...

最新文章

  1. 在Ubuntu 14.04 64bit上使用dig
  2. java导出excel数据量大_解决大批量Excel导出OOM问题
  3. 小米盒子4 android版本,安卓系统越用越卡,曾学忠:小米 10 至尊纪念版搭载黑科技 MITurbo 4.0 技术...
  4. Android Framework系统服务详解
  5. python 图表 web_Web | Django 与 Chart.js 联用做出精美的图表
  6. ​WeihanLi.Npoi 根据模板导出Excel
  7. 揭秘阿里机器翻译团队:拿下5项全球冠军,每天帮商家翻译7.5亿次
  8. python多线程输出_萌新python多线程
  9. 105款移动应用程序就此被清理下架!
  10. 动环监控系统价格,动环监控系统价格多少
  11. 【STM32】STM32CubeMX使用FreeRTOS教程1----定时器学习
  12. git错误集(updating)
  13. 支付宝福利:银行卡信息查询
  14. BitBucket介绍以及基础使用
  15. Kubernetes系列之五:使用yaml文件创建service向外暴露服务
  16. Spring Cloud Consul 注册服务failing,但是可以访问
  17. PHP独立ip统计,通过nginx日志统计独立ip的个数 新乡独立ip 独立ipvps 独立公网i
  18. POJ3376 Finding Palindromes
  19. c语言rand函数源码路径,C语言中的rand()函数
  20. website for all kinds of courses

热门文章

  1. PHP项目部署在tomcat,在Tomcat中部署Web项目的操作方法(必看篇)
  2. cpu居高不下 linux,linux cpu居高不下 调试
  3. gt,gte,lt,lte缩写的含义
  4. 电脑刚开机显示正在锁定计算机在怎么回事,电脑开机一直停留在诊断自动修复界面怎么回事...
  5. Codeforces 1153 C Serval and Parenthesis Sequence
  6. 2020 8月 每日花语
  7. 【企业管理】2019年11 月 每日花语
  8. 信息系统项目管理师论文指导3/3
  9. Winform中使用mysqldump实现选择部分表定期备份mysql数据库
  10. Angular中怎样通过localStorage实现数据持久化-实现存储搜索历史为例