Git 2.41 源代碼控制系統可用

經過三個月的開發,分散式原始碼控制系統Git 2.41已經發布。 Git 是最受歡迎、可靠和高效能的版本控制系統之一,提供基於分支和合併的靈活的非線性開發工具。 為了確保歷史記錄的完整性和對追溯更改的抵抗力,在每次提交中都會使用整個先前歷史記錄的隱式哈希;還可以使用開發人員的數位簽名來驗證各個標籤和提交。

與先前版本相比,新版本包含 542 個變更,由 95 名開發人員參與準備,其中 29 名開發人員首次參與開發。 主要創新點:

  • 改進了對儲存庫中未引用的不可存取物件(未由分支或標籤引用)的處理。 無法存取的物件由垃圾收集器刪除,但在刪除之前會在儲存庫中保留一段時間,以避免競爭情況。 為了追蹤不可達物件的出現週期,需要給它們附加類似物件的變化時間的標籤,這不允許將它們儲存在一個所有物件都有共同變化時間的套件檔案中。 以前,每個無法存取的物件都儲存在單獨的檔案中,當存在大量尚不符合刪除條件的新的無法存取的物件時,這會導致問題。 在新版本中,預設使用“cruft packs”機制來打包不可達對象,該機制允許您將所有不可達對象儲存在一個包文件中,並且每個對象的修改時間資料反映在單獨的表中,存儲位於擴展名為“.mtimes”的檔案中,並使用擴展名為“.idx”的索引檔案進行連結。
    Git 2.41 源代碼控制系統可用
  • 預設情況下啟用在磁碟上維護包檔案的反向索引。 在torvalds/linux儲存庫上進行測試時,使用反向索引可以將資源密集型的「git推送」操作加速1.49倍,以及使用「git cat-」計算單一物件的大小等簡單操作file —batch=' %(objectsize:disk)' "77 次。 具有反向索引的檔案(“.rev”)將儲存在儲存庫中的“.git/objects/pack”目錄中。

    回想一下,Git 以物件的形式儲存所有數據,這些數據位於單獨的檔案中。 為了提高使用儲存庫的效率,物件另外放置在套件檔案中,其中資訊以物件流的形式呈現,這些物件相互跟隨(使用 git fetch 和 git push 傳輸物件時使用類似的格式)命令)。 對於每個包文件,都會建立一個索引文件 (.idx),它允許您使用物件標識符快速確定包文件中存儲給定對象的偏移量。

    新版本中包含的反向索引旨在最佳化根據有關物件在套件檔案中的位置的資訊確定物件識別碼的過程。 以前,這種轉換是在解析套件檔案時動態執行的,並且僅儲存在記憶體中,這不允許重複使用類似的索引,並且每次都強制產生索引。 建立索引的操作歸結為建立一個物件位置對陣列並按位置對其進行排序,這對於大型套件檔案來說可能需要很長時間。

    例如,使用直接索引顯示物件內容的操作比未對位置到物件資料建立索引的顯示物件大小的操作快 62 倍。 使用反向索引後,這些操作開始花費大約相同的時間。 反向索引還允許您在執行獲取和推送命令時透過直接從磁碟傳輸現成的資料來加速物件發送操作。

    Git 2.41 源代碼控制系統可用

  • 「憑證幫助程序」協定用於在存取具有有限存取權的儲存庫時傳輸憑證,它增加了對在憑證處理程序和執行驗證的服務之間傳遞 WWW-Authenticate 標頭的支援。 對 WWW-Authenticate 標頭的支援可讓您傳遞 OAuth 範圍參數,以便更精細地分離使用者對儲存庫的存取以及可用於請求的範圍的界定。
  • 在 for-each-ref 指令中新增了格式化選項「%(ahead-behind:」: )”,它允許您立即獲取有關某個分支相對於另一個分支的存在或不存在的提交數量的信息(一個分支在提交級別落後或領先於另一個分支的數量)。 以前,要獲取此類信息,您需要運行兩個單獨的命令:“git rev-list —count main..my-feature”以獲取分支特有的提交數量,以及“git rev-list —count my-feature ” ..main”來取得缺失提交的數量。 現在,此類計算可以減少為單一命令,從而簡化了處理程序的編寫並減少了執行時間。 例如,要顯示尚未合併的分支並評估它們是在主分支之後還是之前,可以使用單行: $ git for-each-ref —no-merged=origin/HEAD \ —format ='%(refname:short) % (前後:origin/HEAD)' \refs/heads/tb/ | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—排除16 96 tb/roaring-bitmaps 47 3 而不是以前使用的腳本,該腳本運行速度慢了17 倍: $ git for- each-ref — format='%(refname:short)' —no-merged=origin/HEAD \ refs/heads/tb | while read ref do advance="$(git rev-list -count origin/HEAD..$ref)" Behind="$(git rev-list -count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$ahead" "$behind" 完成 | 列 -t tb/cruft-extra-tips 2 96 tb/for-each-ref — 排除 16 96 tb/roaring-bitmaps 47 3
  • 「-porcelain」選項已新增至「git fetch」指令中,指定後,將以下列格式產生輸出: ”,可讀性較差,但更方便在腳本中解析。
  • 新增了「fetch.hideRefs」設置,該設定允許您在檢查伺服器是否已發送全套物件的階段隱藏本機儲存庫中的一些引用,從而加快「git fetch」操作的速度,從而節省時間將檢查僅限於直接檢索資料的伺服器。 例如,當在包含大量追蹤外部連結的儲存庫的系統上執行測試時,排除除發送到目標伺服器 $remote 的連結之外的所有連結可將 git fetch 操作的執行時間從 20 分鐘減少到 30 秒。 $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ 取得 $remote
  • 「git fsck」指令提供了檢查可存取點陣圖和反向索引中的損壞、校驗和合規性以及值的正確性的能力。
  • 現在,當嘗試從 $GIT_DIR 中包含符號連結的儲存庫進行複製時,「git clone --local」命令會顯示錯誤。

來源: opennet.ru

添加評論