简体中文 ▾ 主题 ▾ 最新版本 ▾ git-commit-graph 最后更新于 2.55.0

名称

git-commit-graph - 写入并校验 Git 提交图(commit-graph)文件

概要

git commit-graph verify [--object-dir <dir>] [--shallow] [--[no-]progress]
git commit-graph write [--object-dir <dir>] [--append]
			[--split[=<strategy>]] [--reachable | --stdin-packs | --stdin-commits]
			[--changed-paths] [--[no-]max-new-filters <n>] [--[no-]progress]
			<split-options>

描述

管理序列化的提交图文件。

选项

--object-dir

使用指定的目录作为 packfile 和提交图文件的位置。此参数用于指定仅包含对象目录、而不包含完整 .git 目录的备用位置。提交图文件应位于 <dir>/info 目录中,packfile 应位于 <dir>/pack 中。如果该目录无法转换为绝对路径,或与任何已知的对象目录不匹配,git commit-graph ... 将以非零状态退出。

--progress
--no-progress

显式开启或关闭进度显示。如果两者均未指定,当标准错误连接到终端时会显示进度。

命令

write

根据 packfile 中找到的提交写入提交图文件。如果配置选项 core.commitGraph 已禁用,此命令将输出警告,然后返回成功,且不写入提交图文件。

使用 --stdin-packs 选项时,仅通过遍历指定包索引(pack-index)中的对象来生成新的提交图。(不能与 --stdin-commits--reachable 组合使用。)

使用 --stdin-commits 选项时,通过遍历标准输入中以十六进制 OID 列表形式(每行一个 OID)指定的提交来生成新的提交图。解析为非提交对象的 OID(直接解析或通过解析标签)会被静默忽略。格式错误或不存在的 OID 会生成错误。(不能与 --stdin-packs--reachable 组合使用。)

使用 --reachable 选项时,通过遍历所有引用(refs)起始的提交来生成新的提交图。(不能与 --stdin-commits--stdin-packs 组合使用。)

使用 --append 选项时,包含现有提交图文件中已存在的所有提交。

使用 --changed-paths 选项时,计算并写入提交与其第一个父提交之间路径变更的信息。此操作在大型仓库中可能耗时较长。它能显著提升使用 git log -- <path> 获取目录或文件历史记录时的性能。如果指定了此选项,未来的提交图写入操作将自动假定意图包含此选项。使用 --no-changed-paths 停止存储此数据。--changed-paths 由配置 commitGraph.changedPaths=true 隐含。

使用 --max-new-filters=<n> 选项时,最多生成 n 个新的布隆过滤器(如果指定了 --changed-paths)。如果 n-1,则不强制限制。只有当前层中存在的提交计入此限制。若要回溯计算早期层的布隆过滤器,建议使用 --split=replace。此选项会覆盖 commitGraph.maxNewFilters 配置。

使用 --split[=<strategy>] 选项时,将提交图写入为存储在 <dir>/info/commit-graphs 中的多个提交图文件的链。提交图层根据策略和其他拆分选项进行合并。不在现有提交图中的新提交将被添加到一个新的“顶端(tip)”文件中。如果满足以下合并条件,该文件将与现有文件合并:

  • 如果指定了 --split=no-merge,则永远不会执行合并,且剩余选项被忽略。--split=replace 用新的链覆盖现有链。仅使用 --split 则遵循剩余选项。(注意:合并提交图链会将现有链替换为长度为 1 的链,其中第一个也是唯一的增量文件包含了整个图。)

  • 如果未指定 --size-multiple=<X>,则令 X 等于 2。如果新的顶端文件有 N 个提交,且前一个顶端文件有 M 个提交,且 X 乘以 N 大于 M,则将这两个文件合并为一个文件。

  • 如果指定了 --max-commits=<M>M 为正整数,如果新的顶端文件超过 M 个提交,则将新的顶端文件与前一个顶端文件合并。

    最后,如果未指定 --expire-time=<datetime>,则令 datetime 为当前时间。在写入拆分的提交图后,删除所有修改时间早于 datetime 且未使用的提交图文件。

verify

读取提交图文件并根据对象数据库验证其内容。用于检查是否存在数据损坏。

使用 --shallow 选项时,仅检查拆分提交图链中的顶端提交图文件。

示例

  • 为本地 .git 目录中已打包的提交写入提交图文件。

    $ git commit-graph write
  • 写入提交图文件,使用 <pack-index> 中的提交扩展当前的提交图文件。

    $ echo <pack-index> | git commit-graph write --stdin-packs
  • 写入一个包含所有可达提交的提交图文件。

    $ git show-ref -s | git commit-graph write --stdin-commits
  • 写入一个提交图文件,其中包含当前提交图文件中的所有提交以及从 HEAD 可达的所有提交。

    $ git rev-parse HEAD | git commit-graph write --stdin-commits --append

注意事项

替换对象(replace objects)或提交嫁接(commit grafts)的存在会关闭提交图的读取或写入。参见 git-replace[1]

配置

本节中以下所有内容均从 git-config[1] 文档中选择性地包含。内容与彼处相同:

commitGraph.generationVersion

指定在写入或读取提交图文件时使用的生成号版本类型。如果指定版本 1,则不会写入或读取校正后的提交日期。默认为 2。

commitGraph.maxNewFilters

指定 git commit-graph write 命令的 --max-new-filters 选项的默认值(参见 git-commit-graph[1])。

commitGraph.changedPaths

如果为 true,则 git commit-graph write 默认将计算并写入变更路径布隆过滤器,等同于传入 --changed-paths。如果为 false 或未设置,仅当当前提交图文件中已存在过滤器时,git commit-graph write 才会写入变更路径布隆过滤器。这与不带任何 --[no-]changed-paths 选项执行 git commit-graph write 的默认行为一致。若要重写一个没有任何过滤器的提交图文件,请使用 --no-changed-paths 选项。命令行选项 --[no-]changed-paths 始终优先于此配置。默认为未设置。

commitGraph.readChangedPaths

已弃用。如果为 true 等同于 commitGraph.changedPathsVersion=-1,如果为 false 等同于 commitGraph.changedPathsVersion=0。(如果同时设置了 commitGraph.changedPathVersion,则 commitGraph.changedPathsVersion 优先。)

commitGraph.changedPathsVersion

指定 Git 将要读取和写入的变更路径布隆过滤器版本。可以是 -1、0、1 或 2。请注意,大于 1 的值可能与尚不支持这些版本的老版本 Git 不兼容。在混合版本环境中使用时请小心。

默认为 -1。

如果为 -1,Git 将使用仓库中现有的变更路径布隆过滤器版本;如果没有,则默认为 1。

如果为 0,Git 将不读取任何布隆过滤器,并在指令要求写入时写入版本 1 的布隆过滤器。

如果为 1,Git 将仅读取版本 1 的布隆过滤器,并写入版本 1 的布隆过滤器。

如果为 2,Git 将仅读取版本 2 的布隆过滤器,并写入版本 2 的布隆过滤器。

更多信息请参见 git-commit-graph[1]

文件格式

GIT

Git[1] 套件的一部分