Git近期版本開始支援部分複製(Partial Clone)功能,而程式碼託管服務GitHub與GitLab也開始跟進,GitHub在年初時提到他們正在評估部分複製功能,成熟時會逐步釋出,而GitLab現在則宣布開始提供部分複製功能實驗性測試

部分複製是Git的一項新功能,用來取代Git LFS(Large File Storage),部分複製使Git不再下載儲存庫中的每個檔案,使其在大型儲存庫運作得更好。部分複製經GitLab、GitHub、微軟和Google多年合作發展,在近期開花結果,現在於GitLab中開始實驗性測試,管理員可以視情況啟用該功能。

Git發展至今已經快15年,過去有許多專案不使用Git,因為像是電玩遊戲這類具有許多大型二進位檔案的專案,當Git複製儲存庫時,Git會下載儲存庫中每個檔案的每個版本,在大多數的使用情況中,下載歷史紀錄或許是有用的功能,但大型二進位檔案的複製和擷取速度卻非常慢。

而要在Git處理大型檔案,需要額外的工具,像是2010年釋出的git-annex和2015年的Git LFS,以類似的方式增加Git處理大型檔案的能力,其主要中心思想是,不在Git中儲存大型檔案,而是儲存大型檔案的指標,當需要使用到大型檔案時,再使用指標按需下載檔案。

不過,這種方法的缺點不只是易受人為錯誤影響,而且指針的編碼方式依頻寬以及檔案類型決定,並同時影響儲存庫的所有人,由於對頻寬或是儲存的假設,會隨著時間改變,同時也會依位置而有所不同,但是儲存庫的編碼策略卻不夠靈活到可隨時改變。現在推出的部分複製功能可解決這些問題,因為傳輸的資料較少,加快了擷取和複製的速度,也減少本機電腦的磁碟使用量,GitLab以自家gitlab-com專案舉例,複製速度快50%,傳輸資料量減少70%。

當用戶在普通的git clone指令之後加入過濾器規範,就能以該規範排除特定內容,像是使用—filter=blob:none,就可在複製時排除大型二進位檔案,GitLab提到,在像是gitlab-com這類包含許多圖像的專案上使用,更能體現出部分複製的優點。

GitLab的部分複製現在支援多個遠端伺服器,而且將會讓大型檔案可以儲存在像是AWS S3等物件儲存中,但與Git LFS不同的是,儲存庫或是實例管理員,可以決定物件儲存的位置,以及按需求改變配置。部分複製比Git LFS使用起來更簡單,因為Git LFS需要安裝其他工具,而部分複製不需要,不過使用者仍需要學習使用新選項和配置。

由於在最新的Git 2.25中,過濾功能並未最佳化,因此當使用過濾規範要從Git伺服器中,擷取並排除特定物件,Git需要檢查儲存庫中的每個檔案,並排除所有與過濾器規範相符的物件,不過,Git開發社群已經改進Blob大小過濾效能,預計會在Git 2.26中更新,GitLab計畫會在12.10版本中跟進。

近期Git在複製相關功能的更新,除了增加部分複製功能外,也新增了稀疏簽出(Sparse Checkout)功能,GitLab解釋,部分複製是針對大型儲存庫的特定效能最佳化,而稀疏簽出則是一個相關的最佳化功能,特別針對具有極大量檔案和版本的儲存庫。


Advertisement

更多 iThome相關內容