溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何通過Git來管理多媒體文件

發(fā)布時(shí)間:2022-01-07 16:46:58 來源:億速云 閱讀:102 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容介紹了“如何通過Git來管理多媒體文件”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

Git 管理多媒體文件的問題

眾所周知,Git 用于處理非文本文件不是很好,但是這并不妨礙我們進(jìn)行嘗試。下面是一個(gè)使用 Git 來復(fù)制照片文件的例子:

$ du -hs108K .$ cp ~/photos/dandelion.tif .$ git add dandelion.tif$ git commit -m 'added a photo'[master (root-commit) fa6caa7] two photos 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dandelion.tif$ du -hs1.8M .

目前為止沒有什么異常。增加一個(gè) 1.8MB 的照片到一個(gè)目錄下,使得目錄變成了 1.8 MB 的大小。所以下一步,我們嘗試刪除文件。

$ git rm dandelion.tif$ git commit -m 'deleted a photo'$ du -hs828K .

在這里我們可以看到有些問題:刪除一個(gè)已經(jīng)被提交的文件,還是會(huì)使得存儲庫的大小擴(kuò)大到原來的 8 倍(從 108K 到  828K)。我們可以測試多次來得到一個(gè)更好的平均值,但是這個(gè)簡單的演示與我的經(jīng)驗(yàn)一致。提交非文本文件,在一開始花費(fèi)空間比較少,但是一個(gè)工程活躍地時(shí)間越長,人們可能對靜態(tài)內(nèi)容修改的會(huì)更多,更多的零碎文件會(huì)被加和到一起。當(dāng)一個(gè)  Git 存儲庫變的越來越大,主要的成本往往是速度。拉取和推送的時(shí)間,從最初抿一口咖啡的時(shí)間到你覺得你可能斷網(wǎng)了。

靜態(tài)內(nèi)容導(dǎo)致 Git 存儲庫的體積不斷擴(kuò)大的原因是什么呢?那些通過文本的構(gòu)成的文件,允許 Git  只拉取那些修改的部分。光柵圖以及音樂文件對 Git 文件而言與文本不同,你可以查看一下 .png 和 .wav 文件中的二進(jìn)制數(shù)據(jù)。所以,Git  只不過是獲取了全部的數(shù)據(jù),并且創(chuàng)建了一個(gè)新的副本,哪怕是一張圖僅僅修改了一個(gè)像素。

Git-portal

在實(shí)踐中,許多多媒體項(xiàng)目不需要或者不想追蹤媒體的歷史記錄。相對于文本或者代碼的部分,項(xiàng)目的媒體部分一般有一個(gè)不同的生命周期。媒體資源一般按一個(gè)方向產(chǎn)生:一張圖片從鉛筆草稿開始,以數(shù)字繪畫的形式抵達(dá)它的目的地。然后,盡管文本能夠回滾到早起的版本,但是藝術(shù)制品只會(huì)一直向前發(fā)展。工程中的媒體很少被綁定到一個(gè)特定的版本。例外情況通常是反映數(shù)據(jù)集的圖形,通常是可以用基于文本的格式(如  SVG)完成的表、圖形或圖表。

所以,在許多同時(shí)包含文本(無論是敘事散文還是代碼)和媒體的工程中,Git 是一個(gè)用于文件管理的,可接受的解決方案,只要有一個(gè)在版本控制循環(huán)之外的游樂場來給藝術(shù)家游玩就行。

如何通過Git來管理多媒體文件

Graphic showing relationship between art assets and Git

一個(gè)啟用這個(gè)特性的簡單方法是 Git-portal,這是一個(gè)通過帶有  Git 鉤子的 Bash 腳本,它可將靜態(tài)文件從文件夾中移出 Git 的范圍,并通過符號鏈接來取代它們。Git  提交鏈接文件(有時(shí)候稱作別名或快捷方式),這種符號鏈接文件比較小,所以所有的提交都是文本文件和那些代表媒體文件的鏈接。因?yàn)樘嫔砦募欠栨溄樱怨こ踢€會(huì)像預(yù)期的運(yùn)行,因?yàn)楸镜貦C(jī)器會(huì)處理他們,轉(zhuǎn)換成“真實(shí)的”副本。當(dāng)用符號鏈接替換出文件時(shí),Git-portal  維護(hù)了項(xiàng)目的結(jié)構(gòu),因此,如果你認(rèn)為 Git-portal  不適合你的項(xiàng)目,或者你需要構(gòu)建項(xiàng)目的一個(gè)沒有符號鏈接的版本(比如用于分發(fā)),則可以輕松地逆轉(zhuǎn)該過程。

Git-portal 也允許通過 rsync 來遠(yuǎn)程同步靜態(tài)資源,所以用戶可以設(shè)置一個(gè)遠(yuǎn)程存儲位置,來做為一個(gè)中心的授權(quán)源。

Git-portal 對于多媒體的工程是一個(gè)理想的解決方案。類似的多媒體工程包括視頻游戲、桌面游戲、需要進(jìn)行大型 3D 模型渲染和紋理的虛擬現(xiàn)實(shí)工程、帶圖以及 .odt 輸出的書籍、協(xié)作型的博客站點(diǎn)、音樂項(xiàng)目,等等。藝術(shù)家在應(yīng)用程序中以圖層(在圖形世界中)和曲目(在音樂世界中)的形式執(zhí)行版本控制并不少見——因此,Git  不會(huì)向多媒體項(xiàng)目文件本身添加任何內(nèi)容。Git  的功能可用于藝術(shù)項(xiàng)目的其他部分(例如散文和敘述、項(xiàng)目管理、字幕文件、致謝、營銷副本、文檔等),而結(jié)構(gòu)化遠(yuǎn)程備份的功能則由藝術(shù)家使用。

安裝 Git-portal

Git-portal 的 RPM 安裝包位于 https://klaatu.fedorapeople.org/git-portal,可用于下載和安裝。

此外,用戶可以從 Git-portal 的 Gitlab 主頁手動(dòng)安裝。這僅僅是一個(gè) Bash 腳本以及一些 Git 鉤子(也是 Bash 腳本),但是需要一個(gè)快速的構(gòu)建過程來讓它知道安裝的位置。

$ git clone https://gitlab.com/slackermedia/git-portal.git git-portal.clone$ cd git-portal.clone$ ./configure$ make$ sudo make install
使用 Git-portal

Git-portal 與 Git 一起使用。這意味著,如同 Git  的所有大型文件擴(kuò)展一樣,都需要記住一些額外的步驟。但是,你僅僅需要在處理你的媒體資源的時(shí)候使用  Git-portal,所以很容易記住,除非你把大文件都當(dāng)做文本文件來進(jìn)行處理(對于 Git 用戶很少見)。使用 Git-portal  必須做的一個(gè)安裝步驟是:

$ mkdir bigproject.git$ cd !$$ git init$ git-portal init

Git-portal 的 init 函數(shù)在 Git 存儲庫中創(chuàng)建了一個(gè) _portal 文件夾并且添加到 .gitignore 文件中。

在平日里使用 Git-portal 和 Git 協(xié)同十分平滑。一個(gè)較好的例子是基于 MIDI 的音樂項(xiàng)目:音樂工作站產(chǎn)生的項(xiàng)目文件是基于文本的,但是 MIDI 文件是二進(jìn)制數(shù)據(jù):

$ ls -1_portalsong.1.qtrsong.qtrsong-Track_1-1.midsong-Track_1-3.midsong-Track_2-1.mid$ git add song*qtr$ git-portal song-Track*mid$ git add song-Track*mid

如果你查看一下 _portal 文件夾,你會(huì)發(fā)現(xiàn)那里有最初的 MIDI 文件。這些文件在原本的位置被替換成了指向 _portal 的鏈接文件,使得音樂工作站像預(yù)期一樣運(yùn)行。

$ ls -lG[...] _portal/[...] song.1.qtr[...] song.qtr[...] song-Track_1-1.mid -> _portal/song-Track_1-1.mid*[...] song-Track_1-3.mid -> _portal/song-Track_1-3.mid*[...] song-Track_2-1.mid -> _portal/song-Track_2-1.mid*

與 Git 相同,你也可以添加一個(gè)目錄下的文件。

$ cp -r ~/synth-presets/yoshimi .$ git-portal add yoshimiDirectories cannot go through the portal. Sending files instead.$ ls -lG _portal/yoshimi[...] yoshimi.stat -> ../_portal/yoshimi/yoshimi.stat*

刪除功能也像預(yù)期一樣工作,但是當(dāng)從 _portal 中刪除一些東西時(shí),你應(yīng)該使用 git-portal rm 而不是 git rm。使用 Git-portal 可以確保文件從 _portal 中刪除:

$ ls_portal/    song.qtr             song-Track_1-3.mid@  yoshimi/song.1.qtr  song-Track_1-1.mid@  song-Track_2-1.mid@$ git-portal rm song-Track_1-3.midrm 'song-Track_1-3.mid'$ ls _portal/song-Track_1-1.mid*  song-Track_2-1.mid*  yoshimi/

如果你忘記使用 Git-portal,那么你需要手動(dòng)刪除 _portal 下的文件:

$ git-portal rm song-Track_1-1.midrm 'song-Track_1-1.mid'$ ls _portal/song-Track_1-1.mid* song-Track_2-1.mid* yoshimi/$ trash _portal/song-Track_1-1.mid

Git-portal 其它的唯一功能,是列出當(dāng)前所有的鏈接并且找到里面可能已經(jīng)損壞的符號鏈接。有時(shí)這種情況會(huì)因?yàn)轫?xiàng)目文件夾中的文件被移動(dòng)而發(fā)生:

$ mkdir foo$ mv yoshimi foo$ git-portal statusbigproject.git/song-Track_2-1.mid: symbolic link to _portal/song-Track_2-1.midbigproject.git/foo/yoshimi/yoshimi.stat: broken symbolic link to ../_portal/yoshimi/yoshimi.stat

如果你使用 Git-portal 用于私人項(xiàng)目并且維護(hù)自己的備份,以上就是技術(shù)方面所有你需要知道關(guān)于 Git-portal 的事情了。如果你想要添加一個(gè)協(xié)作者或者你希望 Git-portal 來像 Git 的方式來管理備份,你可以創(chuàng)建一個(gè)遠(yuǎn)程位置。

增加 Git-portal 遠(yuǎn)程位置

為 Git-portal 增加一個(gè)遠(yuǎn)程位置是通過 Git 已有的遠(yuǎn)程功能來實(shí)現(xiàn)的。Git-portal 實(shí)現(xiàn)了 Git 鉤子(隱藏在存儲庫 .git 文件夾中的腳本),來尋找你的遠(yuǎn)程位置上是否存在以 _portal 開頭的文件夾。如果它找到一個(gè),它會(huì)嘗試使用 rsync 來與遠(yuǎn)程位置同步文件。Git-portal 在用戶進(jìn)行 Git 推送以及 Git 合并的時(shí)候(或者在進(jìn)行 Git 拉取的時(shí)候,實(shí)際上是進(jìn)行一次獲取和自動(dòng)合并),都會(huì)執(zhí)行此操作。

如果你僅克隆了 Git 存儲庫,那么你可能永遠(yuǎn)不會(huì)自己添加一個(gè)遠(yuǎn)程位置。這是一個(gè)標(biāo)準(zhǔn)的 Git 過程:

$ git remote add origin git@gitdawg.com:seth/bigproject.git$ git remote -vorigin git@gitdawg.com:seth/bigproject.git (fetch)origin git@gitdawg.com:seth/bigproject.git (push)

對你的主要 Git 存儲庫來說,origin 這個(gè)名字是一個(gè)流行的慣例,將其用于 Git  數(shù)據(jù)是有意義的。然而,你的 Git-portal 數(shù)據(jù)是分開存儲的,所以你必須創(chuàng)建第二個(gè)遠(yuǎn)程位置來讓 Git-portal  了解向哪里推送和從哪里拉取。取決于你的 Git 主機(jī),你可能需要一個(gè)單獨(dú)的服務(wù)器,因?yàn)榭臻g有限的 Git 主機(jī)不太可能接受 GB  級的媒體資產(chǎn)。或者,可能你的服務(wù)器僅允許你訪問你的 Git 存儲庫而不允許訪問外部的存儲文件夾:

$ git remote add _portal seth@example.com:/home/seth/git/bigproject_portal$ git remote -vorigin git@gitdawg.com:seth/bigproject.git (fetch)origin git@gitdawg.com:seth/bigproject.git (push)_portal seth@example.com:/home/seth/git/bigproject_portal (fetch)_portal seth@example.com:/home/seth/git/bigproject_portal (push)

你可能不想為所有用戶提供服務(wù)器上的個(gè)人帳戶,也不必這樣做。為了提供對托管資源庫大文件資產(chǎn)的服務(wù)器的訪問權(quán)限,你可以運(yùn)行一個(gè) Git 前端,比如 Gitolite 或者你可以使用 rrsync (受限的 rsync)。

現(xiàn)在你可以推送你的 Git 數(shù)據(jù)到你的遠(yuǎn)程 Git 存儲庫,并將你的 Git-portal 數(shù)據(jù)到你的遠(yuǎn)程的門戶:

$ git push origin HEAD  master destination detectedSyncing _portal content...sending incremental file listsent 9,305 bytes  received 18 bytes  1,695.09 bytes/sectotal size is 60,358,015  speedup is 6,474.10Syncing _portal content to example.com:/home/seth/git/bigproject_portal

如果你已經(jīng)安裝了 Git-portal,并且配置了 _portal 的遠(yuǎn)程位置,你的 _portal 文件夾將會(huì)被同步,并且從服務(wù)器獲取新的內(nèi)容,以及在每一次推送的時(shí)候發(fā)送新的內(nèi)容。盡管你不需要進(jìn)行 Git 提交或者推送來和服務(wù)器同步(用戶可以使用直接使用 rsync),但是我發(fā)現(xiàn)對于藝術(shù)性內(nèi)容的改變,提交是有用的。這將會(huì)把藝術(shù)家及其數(shù)字資產(chǎn)集成到工作流的其余部分中,并提供有關(guān)項(xiàng)目進(jìn)度和速度的有用元數(shù)據(jù)。

其他選擇

如果 Git-portal 對你而言太過簡單,還有一些用于 Git 管理大型文件的其他選擇。Git 大文件存儲(LFS)是一個(gè)名為 git-media 的停工項(xiàng)目的分支,這個(gè)分支由 GitHub 維護(hù)和支持。它需要特殊的命令(例如 git lfs track 來保護(hù)大型文件不被 Git 追蹤)并且需要用戶維護(hù)一個(gè) .gitattributes 文件來更新哪些存儲庫中的文件被 LFS 追蹤。對于大文件而言,它支持 HTTP 和 HTTPS 遠(yuǎn)程主機(jī)。所以你必須配置 LFS 服務(wù)器,才能使得用戶可以通過 HTTP 而不是 SSH 或 rsync 來進(jìn)行鑒權(quán)。

另一個(gè)相對 LFS 更靈活的選擇是 git-annex。你可以在我的文章 管理 Git 中大二進(jìn)制 blob  中了解更多(忽略其中 git-media 這個(gè)已經(jīng)廢棄項(xiàng)目的章節(jié),因?yàn)槠潇`活性沒有被它的繼任者 Git LFS 延續(xù)下來)。Git-annex   是一個(gè)靈活且優(yōu)雅的解決方案。它擁有一個(gè)細(xì)膩的系統(tǒng)來用于添加、刪除、移動(dòng)存儲庫中的大型文件。因?yàn)樗`活且強(qiáng)大,有很多新的命令和規(guī)則需要進(jìn)行學(xué)習(xí),所以建議看一下它的文檔。

然而,如果你的需求很簡單,你可能更加喜歡整合已有技術(shù)來進(jìn)行簡單且明顯任務(wù)的解決方案,則 Git-portal 可能是對于工作而言比較合適的工具。

“如何通過Git來管理多媒體文件”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

git
AI