名称

git-backfill - 在部分克隆中下载缺失的对象

概要

git backfill [--min-batch-size=<n>] [--[no-]sparse] [--[no-]include-edges] [<revision-range>]

描述

无数据块(Blobless)的部分克隆是通过 git clone --filter=blob:none 创建的,并随后配置本地仓库,使得 Git 客户端除非在本地操作需要时,否则会避免下载数据块(blob)对象。最初这意味着克隆和后续的获取操作仅下载可达的提交(commits)和目录树(trees),而不下载数据块。后续改变 HEAD 指针的操作,例如 git checkoutgit merge,可能需要下载缺失的数据块以完成其操作。

在最坏的情况下,计算数据块差异的命令(如 git blame)会变得非常缓慢,因为它们会在 Git 命令需要时,通过单数据块请求来获取缺失的数据块。这会导致多次下载请求,且 Git 服务器无法跨这些对象提供增量压缩。

git backfill 命令为用户提供了一种方式来请求 Git 下载缺失的数据块(带有可选过滤器),以便批量下载代表文件历史版本的数据块。该 backfill 命令通过对出现在同一路径下的数据块进行分组来优化请求,有望使服务器发送的包文件(packfile)获得良好的增量压缩效果。

通过这种方式,git backfill 提供了一种将大型克隆拆分为较小块的机制。从使用 git clone --filter=blob:none 的无数据块部分克隆开始,然后在本地仓库运行 git backfill,这提供了一种通过多次较小的网络调用来下载所有可达对象的方法,而不是在克隆时下载整个仓库。

默认情况下,git backfill 会下载从 HEAD 提交可达的所有数据块。可以使用下方的各种选项来限制或扩展此集合。

此命令处于实验阶段。其行为在未来可能会发生变化。

选项

--min-batch-size=<n>

指定向服务器请求缺失对象批次的最小大小。给定路径下看到的最后一组数据块可能会超过此大小。默认的最小批次大小为 50,000。

--sparse
--no-sparse

仅在对象出现的路径与当前稀疏检出(sparse-checkout)匹配时才下载它们。如果启用了稀疏检出功能,则默认假定为 --sparse,并可通过 --no-sparse 禁用。

--include-edges
--no-include-edges

在回填(backfill)中包含边界提交的数据块。这在为 git log -p A..Bgit replay --onto TARGET A..B 等命令做准备时很有用,因为 A..B 通常排除 A,但你可能同时也需要来自 A 的数据块。--include-edges 是默认选项。

<revision-range>

仅回填指定修订范围(revision range)内提交可达的数据块。当未指定 <revision-range> 时,默认为 HEAD(即通向当前提交的整个历史记录)。有关 <revision-range> 表示方法的完整列表,请参阅 gitrevisions[7] 的“指定范围”部分。

你还可以使用 git-rev-list[1] 所支持的提交限制选项,例如 --first-parent--since 或路径规格(pathspecs)。

大多数 --filter=<spec> 选项不适用于 git backfill 的目的,但 sparse:<oid> 过滤器已集成,可提供一组集中的路径进行下载,这与 --sparse 选项不同。

GIT

Git[1] 套件的一部分