简体中文 ▾ 主题 ▾ 最新版本 ▾ git-pack-refs 最后更新于 2.52.0

名称

git-pack-refs - 打包分支顶端(heads)和标签以实现高效的仓库访问

概要

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

描述

传统上,分支顶端和标签(统称为 refs,即引用)存储在 $GIT_DIR/refs 目录下的(子)目录中,每个引用对应一个文件。虽然许多分支顶端倾向于经常更新,但大多数标签和某些分支顶端则从不更新。当一个仓库拥有成百上千个标签时,这种“一个引用一个文件”的格式既浪费存储空间又损害性能。

此命令用于解决存储和性能问题,它将引用存储在单个文件 $GIT_DIR/packed-refs 中。当传统的 $GIT_DIR/refs 目录层级中缺失某个引用时,系统会在此文件中查找,如果找到则使用它。

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

处理拥有过多引用的仓库的推荐做法是:先使用 --all 选项打包一次引用,之后偶尔运行 git pack-refs。从定义上讲,标签是静止的且不应改变。分支顶端将通过初始的 pack-refs --all 被打包,但只有当前活跃的分支顶端会变为解包状态,而下一次执行 pack-refs(不带 --all)将使它们保持解包状态。

选项

--all

默认情况下,该命令打包所有标签以及已经处于打包状态的引用,而保持其他引用不变。这是因为分支通常处于活跃开发状态,打包其顶端并无助于提升性能。此选项会导致所有引用也被打包,但隐藏引用、损坏引用和符号引用除外。这对于拥有许多具有历史意义的分支的仓库非常有用。

--no-prune

该命令通常在打包后删除 $GIT_DIR/refs 层级下的松散引用。此选项指示命令不要执行删除操作。

--auto

根据引用数据库的当前状态,按需打包引用。该行为取决于仓库使用的引用格式,且将来可能会发生变化。

  • "files":根据松散引用数量与 packed-refs 文件大小的比例,将松散引用打包到 packed-refs 文件中。packed-refs 文件越大,在重新打包前需要存在的松散引用就越多。

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

--include <模式>

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

--exclude <模式>

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

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

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

BUG

在引入 packed-refs 机制之前编写的旧文档可能仍会说“.git/refs/heads/<分支> 文件存在”,其实际含义是“分支 <分支> 存在”。

GIT

Git[1] 套件的一部分