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

Git系列(七):运用Git办理二进制大目标(git 管理二进制文件)  Git 二进制 管理 第1张

经过这系列的前六篇文章,咱们现已学会运用 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. $gitconfigfilter.media.clean"git-mediafilter-clean"
  2. $gitconfigfilter.media.smudge"git-mediafilter-smudge"

在要运用 git-media 的每个存储库中,设置一个特点以将刚刚创立的过滤器结合到要您分类为“媒体media”的文件类型里。别被这种术语混杂。一个更好的术语是“财物”,由于“媒体”一般的意思是音频、视频和相片,但您也能够很容易地将 3D 模型,烘焙和纹路等归类为媒体。

例如:

  1. $echo"*.mp4filter=media-crlf">>.gitattributes
  2. $echo"*.mkvfilter=media-crlf">>.gitattributes
  3. $echo"*.wavfilter=media-crlf">>.gitattributes
  4. $echo"*.flacfilter=media-crlf">>.gitattributes
  5. $echo"*.krafilter=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. $gitmediasync

要用一个改变后的版别替换 git-media 中的文件时(例如,一个现已美声过的音频文件,或许一个现已完结的遮罩绘画,或许一个现已被色彩分级的视频文件),您有必要清晰的告知 Git 更新该媒体。这将掩盖 git-media 不会仿制长途现已存在的文件的默许设置:

  1. $gitupdate-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. $gitinit--bare--shared/opt/jupiter.git

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

  1. $gitcloneseth@example.com:/opt/jupiter.clone
  2. Cloninginto'jupiter.clone'...
  3. warning:Youappeartohaveclonedanemptyrepository.
  4. Checkingconnectivity...done.
  5. $gitannexinit"sethworkstation"
  6. initsethworkstationok

不要运用过滤器来区别媒体资源或大文件,您能够运用 git annex 指令来装备归类大文件:

  1. $gitannexaddbigblobfile.flac
  2. addbigblobfile.flac
  3. (checksum)ok
  4. (RecordingstateinGit...)

跟一般文件相同进行提交操作:

  1. $gitcommit-m'addedflacsourceforsoundfx'

可是推送操作是不同的,由于 git annex 运用自己的分支来盯梢财物。您***推送或许需求 -u 选项,详细取决于您怎么办理您的存储库:

  1. $gitpush-uoriginmastergit-annex
  2. Toseth@example.com:/opt/jupiter.git
  3. *[newbranch]master->master
  4. *[newbranch]git-annex->git-annex

和 git-media 相同,一般的 git push 指令是不会复制材料到服务器的,仅仅只是发送了相关的音讯,要真实同享文件,需求运转同步指令:

  1. $echo"*.mp4filter=media-crlf">>.gitattributes
  2. $echo"*.mkvfilter=media-crlf">>.gitattributes
  3. $echo"*.wavfilter=media-crlf">>.gitattributes
  4. $echo"*.flacfilter=media-crlf">>.gitattributes
  5. $echo"*.krafilter=media-crlf">>.gitattributes
0

假如他人现已提交了同享资源,您需求拉取它们,git annex sync 指令将提示您要在本地检出你本机没有,但在服务器上存在的资源。

git-media 和 git-annex 都十分灵敏,都能够运用本地存储库来替代服务器,所以它们也常用于办理私有的本地项目。

Git 是一个十分强大和扩展性十分强的体系应用软件,咱们应该坚决果断的运用它。现在就开端试试吧!

转载请说明出处
知优网 » Git系列(七):运用Git办理二进制大目标(git 管理二进制文件)

发表评论

您需要后才能发表评论