Rush StackShopBlogEvents
Skip to main content

使用 Sparo 加速 Git

Monorepos 经常会随着越来越多的项目被合并而迅速增长。虽然 Rush 提供了多种机制来加速安装时间构建时间,但对于非常大的仓库,即使是基本操作如 git clonegit checkout 也可能变得异常缓慢。

Git 优化

Git 提供了一些内置功能,这些功能可能足以加速中等大小的仓库:

  • 浅克隆允许只克隆几个提交,但通常只适用于临时克隆,如 CI 作业。

  • 部分克隆允许在没有文件内容("blobless" 克隆)或甚至没有提交详细信息("treeless" 克隆)的情况下克隆,大大加速了您的 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 monorepo:

第 1 步:克隆仓库

# 安装 Sparo 命令行
npm install -g sparo

# 克隆您的 Rush 仓库 -- 只克隆最小的“骨架”
sparo clone https://github.com/Azure/azure-sdk-for-js.git

第 2 步:创建配置文件

cd azure-sdk-for-js

# 创建一个稀疏检出配置文件,保存在 common/sparo-profiles/my-team.json
sparo init-profile --profile my-team

编辑创建的 my-team.json 文件以添加项目选择器。例如:

common/sparo-profiles/my-team.json

{
"selections": [
{
// 这个演示配置文件将检出 "@azure/arm-commerce" 项目
// 及其所有依赖:
"selector": "--to",
"argument": "@azure/arm-commerce"
}
]
}

第 3 步:检出您的配置文件

保存更改到 my-team.json 之后,现在是应用它的时候了:

sparo checkout --profile my-team

试试看!例如:

rush install

# 构建应该成功,因为 Sparo 确保了依赖项目
# 被包括在稀疏检出中:
rush build --to @azure/arm-commerce

对于日常工作,考虑选择如 sparo revert 这样的镜像子命令代替 git revert。Sparo 包装提供(1)更好的默认设置,(2)更好性能的建议,以及(3)可选的匿名性能度量。

示例:

sparo pull

sparo commit -m "Example command"

另请参阅