TechSummary 2025-08-18
· 閱讀時間約 17 分鐘
🚀 Git 2.51 更新亮點
Source: https://github.blog/open-source/git/highlights-from-git-2-51/
- 無碎片的 Multi-Pack Indexes (MIDXs):
- Git 2.51 引入新的打包行為,允許將無法到達的物件(“cruft pack” 中的物件)儲存在 MIDX 之外,解決了先前將它們排除在 MIDX 之外的困難。
- 透過
repack.MIDXMustContainCruft
配置選項,可使非碎片套件集在可達性上是封閉的。 - 這項改進在 GitHub 內部應用中,顯著縮小了 MIDXs 檔案大小(約 38%),寫入速度提升(35%),整體儲存庫讀取性能提高(約 5%)。
- Path Walk 實現更小尺寸的 Packfiles:
- Git 2.49 引入了 "name-hash v2" 以改進物件的 Delta 壓縮。
- Git 2.51 更進一步,引入了新的「path walk」物件收集方式,在打包時一次性處理來自相同路徑的所有物件。
- 這種方法避免了名稱哈希啟發式,並可在已知位於相同路徑的物件組內尋找 Delta,從而產生通常更小尺寸的 Packfiles。可透過
--path-walk
命令列選項試用。
- Stash 交換格式:
- 過去 Git Stash 內部透過創建三個提交來儲存狀態,且
refs/stash
只儲 存一個 Stash 項目,導致跨機器遷移困難。 - Git 2.51 引入了新的 Stash 內部表示形式,允許將多個 Stash 項目表示為一系列提交,類似於普通的提交日誌,新的 Stash 提交包含四個父級。
- 新版本新增了
git stash export --to-ref
和git stash import
子命令,使得 Stash 內容可以像普通分支或標籤一樣進行匯出、推送和拉取,實現跨機器遷移。
# 在一台機器上
git stash export --to-ref refs/stashes/my-stash
git push origin refs/stashes/my-stash
# 在另一台機器上
git fetch origin '+refs/stashes/*:refs/stashes/*'
git stash import refs/stashes/my-stash - 過去 Git Stash 內部透過創建三個提交來儲存狀態,且
git cat-file
改進:git cat-file
是用於列印物件原始內容的專用工具。- 在 Git 2.51 之前,查詢子模組路徑會顯示
missing
。 - Git 2.51 改善了此輸出,使其在指令碼場景中更 有用,現在能正確識別子模組物件 ID 和類型。
# [ pre-2.51 git ]
echo HEAD:sha1collisiondetection | git cat-file --batch-check
# HEAD:sha1collisiondetection missing
# [ git 2.51 ]
echo HEAD:sha1collisiondetection | git cat-file --batch-check
# 855827c583bc30645ba427885caa40c5b81764d2 submodule- Bloom Filter 改進:
- Git 2.51 增加了對使用多個路徑規範項目的支持,例如
git log -- path/to/a path/to/b
,這些以前無法利用已更改路徑的 Bloom filter。
- Git 2.51 增加了對使用多個路徑規範項目的支持,例如
git switch
和git restore
不再是實驗性命令:- 這兩個命令自 Git 2.23 引入以來,已穩定運行六年,其命令列介面已穩定並向後相容。
git whatchanged
命令被棄用:- 此命令已被標記為棄用,並計畫在 Git 3.0 中移除,但仍可透過
--i-still-use-this
旗標使用。
- 此命令已被標記為棄用,並計畫在 Git 3.0 中移除,但仍可透過
- Git 3.0 的重大變更預告:
reftable
後端將成為 Git 3.0 中新建立儲存庫的預設格式。- SHA-256 哈希函數將成為 Git 3.0 中初始化新儲存庫的預設哈希函數。
- Git 內部開發流程更新:
- 允許在程式碼庫中使用 C99
bool
關鍵字。 - 修訂了貢獻補丁的準則,允許貢獻者使用其合法姓名以外的身份提交補丁,與 Linux 核心的方法更接近。
- 允許在程式碼庫中使用 C99