Git 2.18版本已支援Git協議v2

weixin_34127717發表於2018-07-06

在最新的官方 Git 客戶端正式版2.18中新增了對 Git wire 協議 v2 的支援,並引入了一些效能與 UI 改進的新特性。

\\

在 Git 的核心團隊成員 Brandon Williams 公開宣佈這一訊息前幾周,Git 協議 v2 剛剛合併至 Git 的 master 主幹分支。Git wire 協議定義了 Git 客戶端與服務端如何對於 clone、fetch 和 push 等操作進行通訊。按 Williams 所說,新版本協議的目標是提升效能,並使其能夠更好的適應未來的改進。

\\
\

新版本協議的主要驅動力是使 Git 服務端能夠對各種 ref(分支與 tag)進行過濾操作。

\
\\

這就意味著,Git 伺服器無需將程式碼庫中所有的 ref 一次性傳送給客戶端,再由客戶端進行過濾。在大型的程式碼庫中可能會存在不計其數的 ref,即使某些 ref 是客戶端無需使用的,也不得不載入多達數個 MB 的 ref 資料。在使用 v2 協議之後,Git 伺服器將根據客戶端所需的操作型別,對 ref 進行過濾之後再將列表傳送至客戶端。Williams 舉了一個例子,如果開發者所更新的分支僅比其遠端分支落後幾個提交,或是僅僅檢查本地分支是否已更新,則完全沒有必要在服務端傳遞整個 ref 列表,這對於時間和頻寬都是一種浪費。Williams 表示,基於 Google 內部對協議 v2的使用,在訪問例如 Chrome 這種包含了超過50萬個分支和 tag 的大型倉庫時,比起使用 v1 協議可達到三倍速以上。此外,通過使用新版本協議,更便於實現某些新的特性,例如按需選取 ref,以及拉取和推送 symref 等等。

\\

支援協議 v2 的 Git 客戶端仍然可以與尚未支援 v2 的舊版本服務端進行通訊。這要感謝當初在設計時決定通過一個獨立的通道傳送 v2 所必須的額外資訊。舊版本的服務端會直接忽略這個額外的通道,並返回 ref 的完整列表。

\\

為了讓開發者能夠自行選擇協議的版本,Git 現在新增了一個新的 -c 命令列選項,如以下示例:

\\
\git -c protocol.version=2 ls-remote\
\\

如果希望預設使用 v2 協議,可以修改 Git 的配置:

\\
\git config --global protocol.version=2\
\\

Git 2.18 中的另一個新特性是通過序列化的 commit graph 改善效能。簡單來說,就是新版本的 Git 可以將 commit graph 的結構儲存在某個檔案中,並附加一些額外的後設資料,以加速圖形的載入。在進行獲取列表,對提交歷史進行過濾,以及計算合併的 base 等操作時,會表現得非常高效。這項功能是由微軟的團隊所實現的,該團隊的成員 Derrick Stole 表示,對於大型程式碼庫,例如 Linux kernel 或 Git 本身的程式碼庫進行這類操作時,速度可提升 75–99%。Git 的 commit graph 仍然是一項處於實驗性階段的功能,因為某些 Git 特性無法很好地與 commit graph 相配合,例如淺克隆、物件替換,以及 commit graft 等等。如果不打算使用這些特性,可以通過執行 git config core.commitGraph true 命令啟用 commit graph。

\\

讀者可在官方釋出說明中瞭解 Git 2.18 的完整特性。

\\

檢視英文原文:Git 2.18 Adds Support for Git Protocol Version 2

相關文章