使用 Sparo 加速 Git
隨著越來越多專案加入,單一儲存庫通常會快速成長。雖然 Rush 提供了各種機制來加速安裝時間和建置時間,但對於非常大型的儲存庫,即使是 git clone
和 git checkout
等基本操作也可能變得慢得令人沮喪。
Git 優化
Git 提供了一些內建功能,可能足以加速中型儲存庫
淺層複製允許僅複製少數的提交,但通常只適合拋棄式複製,例如 CI 作業。
部分複製允許在不複製檔案內容(「無 blob」複製)甚至提交詳細資訊(無樹複製)的情況下進行複製,從而大大加快您的
git clone
時間,並允許在git checkout
期間擷取這些詳細資訊。大型檔案儲存 (LFS) 可以將大型二進位檔案移動到單獨的伺服器,僅在需要時在結帳期間下載。但是,使用 LFS 很棘手,因為此功能依賴於 Git 外部的
.gitattributes
篩選:您的.gitattributes
規則可以根據檔案副檔名選擇什麼是「大型」檔案,但是沒有簡單的方法可以根據實際檔案大小或更新頻率進行選擇。如果您不小心選擇了太多檔案,效能可能會比不使用 LFS 更差。此外,變更.gitattributes
無法追溯套用,而無需重寫整個 Git 歷程記錄 -- 對於活躍的儲存庫來說,這是一個非常具破壞性的動作。
幸運的是,Git 提供了更多進階功能,例如稀疏結帳、單分支複製、檔案系統監控器、背景維護以及各種用於調整行為的選擇加入設定。可以直接透過 Git 命令列存取這些功能,但設定可能很複雜。一般使用者通常難以採用。
Sparo 如何提供協助
若要更輕鬆地採用進階 Git 優化,請嘗試使用 Sparo 工具。它直接與 Rush 整合並自動優化 Git。基本策略是沿著三個維度僅擷取您需要的內容:(1) 跳過不相關的分支,(2) 跳過不相關的歷程記錄(部分複製),(3) 跳過不相關專案資料夾的結帳(稀疏結帳)。
Sparo 使用 Sparo 設定檔簡化了稀疏結帳,可以指定智慧型選擇,例如:「僅結帳我的團隊正在處理的兩個應用程式,以及它們在 Rush 工作區中的所有相依性。」這樣,工程師不需要花時間確定要結帳的確切資料夾路徑。Sparo 結帳始終包含一組基本 「骨架資料夾」;這確保每個專案的 package.json 檔案始終可用。Sparo 也可以選擇性地收集匿名 Git 計時指標,協助您的建置團隊分析一段時間內的效能。
Sparo 網站提供了更多背景資訊。
使用 Sparo
Git 和 Sparo 命令列可以互換使用。唯一的要求是,您的工作目錄必須最初使用 sparo clone
而不是 git clone
進行複製。
以下是使用 azure-sdk-for-js(來自 GitHub 的大型公開 RushJS 單一儲存庫)的快速逐步解說
步驟 1:複製儲存庫
# Install the Sparo command-line
npm install -g sparo
# Clone your Rush repository -- only the minimal "skeleton" gets cloned
sparo clone https://github.com/Azure/azure-sdk-for-js.git
步驟 2:建立設定檔
cd azure-sdk-for-js
# Create a sparse checkout profile, saved in common/sparo-profiles/my-team.json
sparo init-profile --profile my-team
編輯建立的 my-team.json 檔案以新增專案選取器。例如
common/sparo-profiles/my-team.json
{
"selections": [
{
// This demo profile will check out the "@azure/arm-commerce" project
// and all of its dependencies:
"selector": "--to",
"argument": "@azure/arm-commerce"
}
]
}
步驟 3:結帳您的設定檔
在儲存對 my-team.json 的變更之後,現在是套用變更的時候了
sparo checkout --profile my-team
試試看!例如
rush install
# The build should succeed because Sparo ensured that dependency projects
# were included in the sparse checkout:
rush build --to @azure/arm-commerce
對於日常工作,請考慮選擇鏡像子命令,例如 sparo revert
而不是 git revert
。Sparo 包裝函式提供 (1) 更好的預設值、(2) 更好的效能建議和 (3) 選擇性的匿名效能指標。
範例
sparo pull
sparo commit -m "Example command"
另請參閱
- Sparo 網站
- 加速前端單一儲存庫的 Git:Sparo 簡介 - 來自 Sparo 維護人員的部落格文章