使用 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 维护者的博客文章