稀疏检出

Firefox 代码库很大:超过 230,000 个文件。如此多的文件可能会给机器、工具和流程带来很大的压力。

一些版本控制工具能够仅使用存储库中的文件子集填充工作目录/检出。这称为稀疏检出

Firefox 代码库中的各种工具都配置为在使用稀疏检出时工作。

Mercurial 中的稀疏检出

Mercurial 4.3 在官方发行版中引入了对稀疏检出的实验性支持(Facebook 编写的扩展已经作为第三方扩展实现了该功能多年)。

要在 Mercurial 中启用稀疏检出支持,请启用sparse扩展

[extensions]
sparse =

工作目录的稀疏性使用hg debugsparse进行管理。运行hg help debugsparsehg help -e sparse以获取有关该功能的更多信息。

启用稀疏配置后,工作目录仅包含与该配置匹配的文件。您无法在稀疏配置之外hg addhg remove文件。

警告

Mercurial 4.3 中的稀疏支持没有任何向后兼容性保证。预计会有所改变。强烈建议不要针对命令编写脚本或依赖于行为。

树内稀疏配置文件

Mercurial 支持使用版本控制下的文件定义稀疏配置。这些称为稀疏配置文件

从本质上讲,稀疏配置文件就像存储库中的任何其他文件一样进行管理。当您hg update时,稀疏配置会根据正在更新到的修订版本中的稀疏配置文件进行评估。从最终用户的角度来看,您只需要激活一次配置文件,并在版本化配置文件更新时适当地添加或删除文件。

在 Firefox 代码库中,build/sparse-profiles目录包含 Mercurial稀疏配置文件文件。

每个稀疏配置文件基本上都定义了要包含或排除的文件模式列表(请参阅hg help patterns)。有关更多信息,请参阅hg help -e sparse

Mach 对稀疏检出的支持

mach检测到何时正在使用稀疏检出,并且其行为可能会发生变化以适应这种情况。

默认情况下,如果mach无法加载它被告知要加载的mach_commands.py文件之一,则会发生致命错误。但是,如果正在使用稀疏检出,mach假定该文件不是稀疏检出的一部分,并忽略缺少文件错误。这意味着在稀疏检出中运行mach将只能访问稀疏检出中定义的命令。

自动化中的稀疏检出

hg robustcheckout(用于在自动化中执行克隆和工作目录操作的扩展/命令)支持稀疏检出。但是,与 Mercurial 的默认稀疏检出实现相比,它有一些限制

  • 一次仅支持 1 个配置文件

  • 不支持非配置文件稀疏配置

  • 不允许从非稀疏检出过渡到稀疏检出,反之亦然

这些限制确保了hg robustcheckout填充的任何稀疏工作目录都尽可能一致和健壮。

run-task(自动化中用于引导任务的低级脚本)支持稀疏检出。

使用run-task的 TaskGraph 任务可以在 YAML(或代码中)中指定sparse-profile属性以表示要使用的稀疏配置文件。例如:

run:
    using: run-command
    command: <command>
    sparse-profile: taskgraph

这会自动导致run-taskhg robustcheckout使用build/sparse-profiles/<value>中定义的稀疏配置文件。

稀疏检出的优缺点

稀疏检出的好处是它使代码库看起来更小。这意味着

  • 执行工作目录操作的时间更少 -> 更快的版本控制操作

  • 需要查阅的文件更少 -> 更快的操作

  • 工作目录仅包含所需内容 -> 更容易理解每个内容的作用

工作目录中的文件更少也导致了一些缺点

  • 搜索可能不会产生命中,因为文件不在稀疏检出中。例如,全局搜索和替换最终可能根本不是全局的。

  • 执行文件系统遍历或路径通配符扩展(例如**/*.js)的工具可能会找不到文件,因为它们不存在。

  • 各种工具和流程都假设存储库中的所有文件始终可用。

混合使用稀疏检出和非稀疏检出也可能导致问题。例如,如果自动化中的一个进程正在使用稀疏检出,而本地开发人员没有使用稀疏检出,则本地开发人员的工作可能正常,但在自动化中却失败(因为文件未包含在稀疏配置中,并且自动化无法使用它。此外,如果环境没有使用完全相同的稀疏配置,则差异会导致行为差异。

何时应该使用稀疏检出?

建议开发人员在处理稀疏检出的工具改进之前不要将其用于本地工作。特别是,Mercurial 对稀疏的支持仍然是实验性的,并且各种 Firefox 工具都假设所有文件都可用。开发人员应自行承担使用稀疏检出的风险。

在自动化中使用稀疏检出是性能与健壮性的权衡。使用稀疏检出将使自动化速度更快,因为机器只需要管理检出中的几千个文件,而不是几十万个文件。这可能会转化为每天每台机器节省几分钟。在数千台机器的规模下,节省的成本可能是巨大的。但是采用稀疏检出将为故障开辟新的途径。(请参阅上文。)如果一个流程在文件访问方面是孤立的并且经过充分理解,则可以使用稀疏检出,风险很小。但是,如果一个流程正在执行诸如遍历文件系统和执行大量通配符匹配的操作,则危险性更高。