Rush Stack商店部落格活動
跳至主要內容

使用 Sparo 加速 Git

隨著越來越多專案加入,單一儲存庫通常會快速成長。雖然 Rush 提供了各種機制來加速安裝時間建置時間,但對於非常大型的儲存庫,即使是 git clonegit 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"

另請參閱