Skip to content

git-commit-graph

命令名称 - 写入和验证 Git commit-graph 文件

概要

bash
[verse]
'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>

描述

管理序列化的 commit-graph 文件。

选项

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

  • --progress / --no-progress - 显式开启/关闭进度显示。如果未指定,当标准错误连接到终端时显示进度。

命令

  • write - 基于包文件中找到的提交写入 commit-graph 文件。如果配置选项 core.commitGraph 被禁用,则此命令将输出警告,然后返回成功而不写入 commit-graph 文件。

    • 使用 --stdin-packs 选项时,通过仅在指定的包索引中遍历对象来生成新的提交图。(不能与 --stdin-commits--reachable 结合使用。)
    • 使用 --stdin-commits 选项时,通过从 stdin 中指定的提交(以十六进制 OID 列表形式,每行一个 OID)开始遍历提交来生成新的提交图。解析为非提交的 OID(直接或通过剥离标签)将被静默忽略。格式错误或不存在的 OID 将产生错误。(不能与 --stdin-packs--reachable 结合使用。)
    • 使用 --reachable 选项时,通过从所有引用开始遍历提交来生成新的提交图。(不能与 --stdin-commits--stdin-packs 结合使用。)
    • 使用 --append 选项时,包含现有 commit-graph 文件中存在的所有提交。
    • 使用 --changed-paths 选项时,计算并写入提交与其第一个父级之间更改的路径信息。此操作在大型仓库上可能需要一段时间。它为使用 git log -- <path> 获取目录或文件的历史记录提供了显著的性能提升。如果给出此选项,未来的 commit-graph 写入将自动假定此选项是预期的。使用 --no-changed-paths 停止存储此数据。--changed-paths 由配置 commitGraph.changedPaths=true 隐含。
    • 使用 --max-new-filters=<n> 选项时,最多生成 n 个新的布隆过滤器(如果指定了 --changed-paths)。如果 n-1,则不强制执行限制。只有新层中的提交才计入此限制。要追溯计算早期层的布隆过滤器,建议使用 --split=replace。覆盖 commitGraph.maxNewFilters 配置。
    • 使用 --split[=<strategy>] 选项时,将 commit-graph 写入存储在 <dir>/info/commit-graphs 中的多个 commit-graph 文件链。commit-graph 层根据策略和其他分割选项进行合并。尚未在 commit-graph 中的新提交被添加到新的"tip"文件中。如果满足以下合并条件,此文件将与现有文件合并:
      • 如果指定了 --split=no-merge,则永远不执行合并,其余选项将被忽略。--split=replace 用新链覆盖现有链。单独的 --split 延迟到其余选项。(请注意,合并提交图链会用长度为 1 的链替换现有链,其中第一个也是唯一的增量持有整个图。)
      • 如果未指定 --size-multiple=<X>,则 X 等于 2。如果新的 tip 文件将有 N 个提交,而之前的 tip 有 M 个提交,且 X 乘以 N 大于 M,则将两个文件合并为一个文件。
      • 如果指定了 --max-commits=<M>M 为正整数),且新的 tip 文件将有超过 M 个提交,则将新的 tip 与之前的 tip 合并。
    • 最后,如果未指定 --expire-time=<datetime>,则 datetime 为当前时间。写入分割 commit-graph 后,删除所有修改时间早于 datetime 的未使用 commit-graph。
  • verify - 读取 commit-graph 文件并对照对象数据库验证其内容。用于检查损坏的数据。

    • 使用 --shallow 选项时,仅检查分割 commit-graph 链中的 tip commit-graph 文件。

示例

  • 为本地 .git 目录中的打包提交写入 commit-graph 文件。

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

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

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

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

注意事项

替换对象或提交嫁接的存在会关闭对 commit-graph 的读取或写入。参阅 git-replace(1)

配置

本节中此行以下的所有内容都是从 git-config(1) 文档中有选择地包含的。内容与那里找到的相同:

  • commitGraph.generationVersion - 指定在写入或读取 commit-graph 文件时使用的代数版本类型。如果指定版本 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 或未设置,则仅在过滤器已存在于当前 commit-graph 文件中时,才会在 git commit-graph write 期间写入更改路径布隆过滤器。这与没有任何 --[no-]changed-paths 选项的 git commit-graph write 的默认行为匹配。要重写没有任何过滤器的 commit-graph 文件,请使用 --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)

文件格式

参阅 gitformat-commit-graph(5)

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布