主頁 > 知識(shí)庫 > 使用Git管理二進(jìn)制大對(duì)象的方法

使用Git管理二進(jìn)制大對(duì)象的方法

熱門標(biāo)簽:依蘭縣地圖標(biāo)注app pageadm實(shí)現(xiàn)地圖標(biāo)注 山東企業(yè)電銷機(jī)器人價(jià)格 百度地圖標(biāo)注開鎖電話 公司400電話辦理價(jià)格 潮州地圖標(biāo)注 安陽百應(yīng)電銷機(jī)器人加盟 琿春市地圖標(biāo)注app 百度中國地圖標(biāo)注中心

通過這系列的前六篇文章,我們已經(jīng)學(xué)會(huì)使用 Git 來對(duì)文本文件進(jìn)行版本控制的管理。我們不禁要問,還有二進(jìn)制文件呢,也可進(jìn)行進(jìn)行版本控制嗎?答案是肯定的,Git 已經(jīng)有了可以處理像多媒體文件這樣的二進(jìn)制大對(duì)象塊(blob)的擴(kuò)展。因此,今天我們會(huì)學(xué)習(xí)使用 Git 來管理所謂的二進(jìn)制資產(chǎn)。

似乎大家都認(rèn)可的事就是 Git 對(duì)于大的二進(jìn)制對(duì)象文件支持得不好。要記住,二進(jìn)制大對(duì)象與大文本文件是不同的。雖然 Git 對(duì)大型的文本文件版本控制毫無問題,但是對(duì)于不透明的二進(jìn)制文件起不了多大作用,只能把它當(dāng)作一個(gè)大的實(shí)體黑盒來提交。

設(shè)想這樣的場(chǎng)景,有一個(gè)另人興奮的第一人稱解密游戲,您正在為它制作復(fù)雜的 3D 建模,源文件是以二進(jìn)制格式保存的,最后生成一個(gè) 1GB 大小的的文件。您提交過一次,在 Git 源倉庫歷史中有一個(gè) 1GB 大小的新增提交。隨后,您修改了下模型人物的頭發(fā)造型,然后提交更新,因?yàn)?Git 并不能把頭發(fā)從頭部及模型中其余的部分離開來,所以您只能又提交 1GB 的量。接著,您改變了模型的眼睛顏色,提交這部分更新:又是 GB 級(jí)的提交量。對(duì)一個(gè)模型的一些微小修改,就會(huì)導(dǎo)致三個(gè) GB 級(jí)的提交量。對(duì)于想對(duì)一個(gè)游戲所有資源進(jìn)行版本控制這樣的規(guī)模,這是個(gè)嚴(yán)重的問題。

不同的是如obj這種格式的文本文件,和其它類型文件一樣,都是一個(gè)提交就存儲(chǔ)所有更新修改狀態(tài),不同的是obj 文件是一系列描述模型的純文本行。如果您修改了該模型并保存回obj 文件,Git 可以逐行讀取這兩個(gè)文件,然后創(chuàng)建一個(gè)差異版本,得到一個(gè)相當(dāng)小的提交。模型越精細(xì),提交就越小,這就是標(biāo)準(zhǔn)的 Git 用例。雖然文件本身很大,但 Git 使用覆蓋或稀疏存儲(chǔ)的方法來構(gòu)建當(dāng)前數(shù)據(jù)使用狀態(tài)的完整描述。

然而,不是所有的都是純文本的,但都要使用 Git,所以需要解決方案,并且已經(jīng)出現(xiàn)幾個(gè)了。

OSTree 開始是作為 GNOME 項(xiàng)目出現(xiàn)的,旨在管理操作系統(tǒng)的二進(jìn)制文件。它不適用于這里,所以我直接跳過。

Git 大文件存儲(chǔ)(LFS) 是放在 GitHub 上的一個(gè)開源項(xiàng)目,是從 git-media 項(xiàng)目中分支出來的。git-media 和 git-annex 是 Git 用于管理大文件的擴(kuò)展。它們是對(duì)同一問題的兩種不同的解決方案,各有優(yōu)點(diǎn)。雖然它們都不是官方的項(xiàng)目,但在我看來,每個(gè)都有獨(dú)到之處:

git-media 是集中模式,有一個(gè)公共資產(chǎn)的存儲(chǔ)庫。你可以告訴 git-media 大文件需要存儲(chǔ)的位置,是在硬盤、服務(wù)器還是在云存儲(chǔ)服務(wù)器,項(xiàng)目中的每個(gè)用戶都將該位置視為大型文件的中心主存儲(chǔ)位置。 git-annex 側(cè)重于分布模式。用戶各自創(chuàng)建存儲(chǔ)庫,每個(gè)存儲(chǔ)庫都有一個(gè)存儲(chǔ)大文件的本地目錄git/annex。這些 annex 會(huì)定期同步,只要有需要,每個(gè)用戶都可以訪問到所有的資源。除非通過 annex-cost 特別配置,否則 git-annex 優(yōu)先使用本地存儲(chǔ),再使用外部存儲(chǔ)。

對(duì)于這些,我已經(jīng)在生產(chǎn)中使用了 git-media 和 git-annex,那么下面會(huì)向你們概述其工作原理。

git-media

git-media 是使用 Ruby 語言開發(fā)的,所以首先要安裝 gem(LCTT 譯注:Gem 是基于 Ruby 的一些開發(fā)工具包)。安裝說明在其網(wǎng)站上。想使用 git-meida 的用戶都需要安裝它,因?yàn)?gem 是跨平臺(tái)的工具,所以在各平臺(tái)都適用。

安裝完 git-media 后,你需要設(shè)置一些 Git 的配置選項(xiàng)。在每臺(tái)機(jī)器上只需要配置一次。

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

在要使用 git-media 的每個(gè)存儲(chǔ)庫中,設(shè)置一個(gè)屬性以將剛剛創(chuàng)建的過濾器結(jié)合到要您分類為“媒體”的文件類型里。別被這種術(shù)語混淆。一個(gè)更好的術(shù)語是“資產(chǎn)”,因?yàn)?ldquo;媒體”通常的意思是音頻、視頻和照片,但您也可以很容易地將 3D 模型,烘焙和紋理等歸類為媒體。

例如:

$ echo "*.mp4 filter=media -crlf" >> .gitattributes
$ echo "*.mkv filter=media -crlf" >> .gitattributes
$ echo "*.wav filter=media -crlf" >> .gitattributes
$ echo "*.flac filter=media -crlf" >> .gitattributes
$ echo "*.kra filter=media -crlf" >> .gitattributes

當(dāng)您要暫存stage這些類型的文件時(shí),文件會(huì)被復(fù)制到git/media目錄。

假設(shè)在服務(wù)器已經(jīng)有了一個(gè) Git 源倉庫,最后一步就告訴源倉庫“母艦”所在的位置,也就是,當(dāng)媒體文件被推送給所有用戶共享時(shí),媒體文件將會(huì)存儲(chǔ)的位置。這在倉庫的 git/config 文件中設(shè)置,請(qǐng)?zhí)鎿Q成您的用戶名、主機(jī)和路徑:

[git-media]
transport = scp
autodownload = false #默認(rèn)為 true,拉取資源
scpuser = seth
scphost = example.com
scppath = /opt/jupiter.git

如果您的服務(wù)器上 SSH 設(shè)置比較復(fù)雜,例如使用了非標(biāo)準(zhǔn)端口或非默認(rèn) SSH 密鑰文件的路徑,請(qǐng)使用ssh/config為主機(jī)設(shè)置默認(rèn)配置。

git-media 的使用和普通文件一樣,可以把普通文件和 blob 文件一樣對(duì)待,一樣進(jìn)行 commit 操作。操作流程中唯一的不同就是,在某些時(shí)候,您應(yīng)該將您的資產(chǎn)(或稱媒體)同步到共享存儲(chǔ)庫中。

當(dāng)要為團(tuán)隊(duì)發(fā)布資產(chǎn)或自己備份資料時(shí),請(qǐng)使用如下命令:

$ git media sync

要用一個(gè)變更后的版本替換 git-media 中的文件時(shí)(例如,一個(gè)已經(jīng)美聲過的音頻文件,或者一個(gè)已經(jīng)完成的遮罩繪畫,或者一個(gè)已經(jīng)被顏色分級(jí)的視頻文件),您必須明確的告訴 Git 更新該媒體。這將覆蓋 git-media 不會(huì)復(fù)制遠(yuǎn)程已經(jīng)存在的文件的默認(rèn)設(shè)置:

$ git update-index --really-refresh

當(dāng)您團(tuán)隊(duì)的其他成員(或是您本人,在其它機(jī)器上)克隆本倉庫時(shí),如果沒有在git/config中把a(bǔ)utodownload選項(xiàng)設(shè)置為true的話,默認(rèn)是不會(huì)下載資源的。但 git-media 的一個(gè)同步命令git media sync可解決所有問題。

git-annex

git-annex 的處理流程略微的有些不同,默認(rèn)是使用本地倉庫的,但基本的思想都一樣。您可以從你的發(fā)行版的軟件倉庫中安裝 git-annex,或者根據(jù)需要從該網(wǎng)站上下載安裝。與 git-media 一樣,任何使用 git-annex 的用戶都必須在其機(jī)器上安裝它。

其初始化設(shè)置比 git-media 都簡(jiǎn)單。運(yùn)行如下命令,其中替換成您的路徑,就可以在您的服務(wù)器上創(chuàng)建好裸存儲(chǔ)庫:

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

然后克隆到本地計(jì)算機(jī),把它標(biāo)記為 git-annex 的初始路徑:

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

不要使用過濾器來區(qū)分媒體資源或大文件,您可以使用git annex 命令來配置歸類大文件:

$ git annex add bigblobfile.flac
add bigblobfile.flac
(checksum) ok
(Recording state in Git...)

跟普通文件一樣進(jìn)行提交操作:

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

但是推送操作是不同的,因?yàn)間it annex使用自己的分支來跟蹤資產(chǎn)。您首次推送可能需要-u 選項(xiàng),具體取決于您如何管理您的存儲(chǔ)庫:

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

和 git-media 一樣,普通的git push 命令是不會(huì)拷貝資料到服務(wù)器的,僅僅只是發(fā)送了相關(guān)的消息,要真正共享文件,需要運(yùn)行同步命令:

$ git annex sync --content

人已經(jīng)提交了共享資源,您需要拉取它們,git annex sync 命令將提示您要在本地檢出你本機(jī)沒有,但在服務(wù)器上存在的資源。

git-media 和 git-annex 都非常靈活,都可以使用本地存儲(chǔ)庫來代替服務(wù)器,所以它們也常用于管理私有的本地項(xiàng)目。

Git 是一個(gè)非常強(qiáng)大和擴(kuò)展性非常強(qiáng)的系統(tǒng)應(yīng)用軟件,我們應(yīng)該毫不猶豫的使用它。現(xiàn)在就開始試試吧!

標(biāo)簽:呼和浩特 三明 公主嶺 常德 連云港 林芝 晉中 香港

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《使用Git管理二進(jìn)制大對(duì)象的方法》,本文關(guān)鍵詞  使用,Git,管理,二進(jìn)制,大,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《使用Git管理二進(jìn)制大對(duì)象的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于使用Git管理二進(jìn)制大對(duì)象的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章