English ▾ 主题 ▾ 最新版本 ▾ git-pack-refs 上次更新于 2.45.0

名称

git-pack-refs - 打包 head 和 tag 以实现高效的存储库访问

概要

git pack-refs [--all] [--no-prune] [--auto] [--include <pattern>] [--exclude <pattern>]

描述

传统上,分支和标签的提示(统称为refs)以每个 ref 一个文件的形式存储在 $GIT_DIR/refs 目录下的(子)目录中。 虽然许多分支提示倾向于经常更新,但大多数标签和一些分支提示永远不会更新。 当存储库有数百或数千个标签时,这种每个 ref 一个文件的格式既浪费存储空间又影响性能。

此命令用于通过将 refs 存储在单个文件 $GIT_DIR/packed-refs 中来解决存储和性能问题。 当从传统的 $GIT_DIR/refs 目录结构中找不到 ref 时,会在该文件中查找它,如果找到则使用它。

对分支的后续更新始终会在 $GIT_DIR/refs 目录结构下创建新文件。

处理具有过多 refs 的存储库的推荐做法是使用 --all 打包一次其 refs,并偶尔运行 git pack-refs。 标签的定义是静态的,预计不会更改。 分支 head 将使用初始的 pack-refs --all 进行打包,但只有当前活动的分支 head 将被解包,而下一个 pack-refs(没有 --all)将使它们保持未解包状态。

选项

--all

默认情况下,该命令会打包所有已打包的标签和 refs,而将其他 refs 保持原样。 这是因为分支预计会得到积极开发,并且打包它们的提示无助于提高性能。 此选项会导致所有 refs 也被打包,隐藏的 refs、损坏的 refs 和符号链接 refs 除外。 适用于具有许多历史兴趣分支的存储库。

--no-prune

该命令通常在打包后删除 $GIT_DIR/refs 结构下的松散 refs。 此选项告诉它不要这样做。

--auto

根据 ref 数据库的当前状态按需打包 refs。 该行为取决于存储库使用的 ref 格式,并且将来可能会更改。

  • "files": 尚未实现 --auto 的特殊处理。

  • "reftable": 对表进行压缩,使其形成一个几何序列。 对于两个表 N 和 N+1,其中 N+1 较新,这保持了 N 至少是 N+1 两倍大的属性。 只有违反此属性的表才会被压缩。

--include <pattern>

根据 glob(7) 模式打包 refs。 重复此选项会累积包含模式。 如果一个 ref 同时包含在 --include--exclude 中,则 --exclude 优先。 使用 --include 将阻止默认情况下包含所有标签。 符号链接 refs 和损坏的 refs 永远不会被打包。 与 --all 一起使用时,它将不起作用。 使用 --no-include 清除并重置模式列表。

--exclude <pattern>

不要打包与给定的 glob(7) 模式匹配的 refs。 重复此选项会累积排除模式。 使用 --no-exclude 清除并重置模式列表。 如果一个 ref 已经被打包,包括它与 --exclude 不会解包它。

--all 一起使用时,仅打包与任何提供的 --exclude 模式不匹配的松散 refs。

--include 一起使用时,提供给 --include 的 refs,减去提供给 --exclude 的 refs 将被打包。

缺陷

在引入 packed-refs 机制之前编写的旧文档可能仍然会说“.git/refs/heads/<branch> 文件存在”,而它指的是“分支 <branch> 存在”。

GIT

属于 git[1] 套件的一部分

scroll-to-top