简体中文 ▾ 主题 ▾ 最新版本 ▾ git-repack 最后更新于 2.51.0

名称

git-repack - 打包仓库中未打包的对象

概要

git repack [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m]
	[--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>]
	[--write-midx] [--name-hash-version=<n>] [--path-walk]

描述

此命令用于将当前不在“pack”中的所有对象合并到一个 pack 中。它还可以用于将现有的 pack 重新组织成一个更高效的 pack。

Pack 是一个对象集合,每个对象都经过单独压缩,并应用了增量压缩,存储在一个文件中,并带有一个关联的索引文件。

Pack 用于减轻镜像系统、备份引擎、磁盘存储等的负载。

选项

-a

不增量打包未打包的对象,而是将所有引用的对象打包到一个 pack 中。当打包用于私有开发的仓库时特别有用。与 -d 配合使用。这将清理 git prune 留下的对象,但 git fsck --full --dangling 显示为悬空的对象。

请注意,通过 dumb 协议获取的用户必须获取整个新 pack 才能获得其中包含的任何对象,无论他们本地已经拥有多少其他对象。

Promisor packfiles 被单独 repacked:如果存在具有关联 ".promisor" 文件的 packfiles,这些 packfiles 将被 repacked 到另一个单独的 pack 中,并会写入一个与新单独 pack 对应的空 ".promisor" 文件。

-A

-a 相同,除非使用了 -d。在这种情况下,前一个 pack 中任何无法访问的对象将变为松散的、未打包的对象,而不是保留在旧 pack 中。无法访问的对象永远不会被有意添加到 pack 中,即使在 repacking 时也是如此。此选项可防止无法访问的对象通过保留在旧 pack 中然后被删除的方式立即删除。相反,松散的无法访问的对象将根据下次 *git gc* 调用中的正常过期规则进行修剪。请参阅 git-gc[1]

-d

打包后,如果新创建的 pack 使某些现有 pack 变得多余,则删除多余的 pack。还运行 *git prune-packed* 以删除多余的松散对象文件。

--cruft

-a 相同,除非使用了 -d。在这种情况下,任何无法访问的对象将被打包到一个单独的 cruft pack 中。下次调用 git gc 时(请参阅 git-gc[1]),可以使用正常的过期规则修剪无法访问的对象。与 -k 不兼容。

--cruft-expiration=<approxidate>

立即过期早于 <approxidate> 的无法访问的对象,而不是等待下次调用 git gc。仅与 --cruft -d 一起使用时有用。

--max-cruft-size=<n>

覆盖 cruft pack 的 --max-pack-size。默认继承 --max-pack-size 的值(如果指定)。有关更多详细信息,请参阅 --max-pack-size 的文档。

--combine-cruft-below-size=<n>

生成 cruft pack 而不进行修剪时,仅重新打包大小严格小于 <n> 的现有 cruft pack,其中 <n> 表示字节数,可以可选地附加“k”、“m”或“g”。大小大于或等于 <n> 的 cruft pack 将保持不变,不被重新打包。当您希望避免在有许多大型或非常大的无法访问对象的仓库中重新打包大型 cruft pack 时非常有用。

--expire-to=<dir>

将包含修剪后对象的 cruft pack(如果有)写入目录 <dir>。此选项对于将任何修剪后的对象副本保留在单独的目录中作为备份非常有用。仅与 --cruft -d 一起使用时有用。

-l

--local 选项传递给 *git pack-objects*。请参阅 git-pack-objects[1]

-f

--no-reuse-delta 选项传递给 git-pack-objects,请参阅 git-pack-objects[1]

-F

--no-reuse-object 选项传递给 git-pack-objects,请参阅 git-pack-objects[1]

-q
--quiet

不在标准错误流上显示进度,并将 -q 选项传递给 *git pack-objects*。请参阅 git-pack-objects[1]

-n

不使用 *git update-server-info* 更新服务器信息。此选项会跳过更新用于通过 HTTP 或 FTP 发布此仓库(或其直接副本)所需的本地目录文件。请参阅 git-update-server-info[1]

--window=<n>
--depth=<n>

这两个选项影响 pack 中包含的对象如何使用增量压缩进行存储。对象首先按类型、大小以及可选的名称进行内部排序,并与 --window 内的其他对象进行比较,以查看使用增量压缩是否可以节省空间。--depth 限制了最大的增量深度;过深的 delta 会影响解包程序的性能,因为需要应用这么多次 delta 数据才能获得所需的对象。

--window 的默认值为 10,--depth 的默认值为 50。最大深度为 4095。

--threads=<n>

此选项将被传递给 git pack-objects

--window-memory=<n>

此选项在 --window 之上提供了一个额外的限制;窗口大小将动态缩放,以不超过 *<n>* 字节的内存使用量。这对于包含混合大小对象的仓库非常有用,可以避免因大窗口而耗尽内存,同时仍然可以利用大窗口处理小对象。大小可以附加“k”、“m”或“g”。--window-memory=0 使内存使用无限制。默认值来自 pack.windowMemory 配置变量。请注意,实际内存使用量将是限制乘以 git-pack-objects[1] 使用的线程数。

--max-pack-size=<n>

每个输出 pack 文件的最大大小。大小可以附加“k”、“m”或“g”。允许的最小大小限制为 1 MiB。如果指定,可能会创建多个 packfile,这也会阻止创建位图索引。默认情况下是无限制的,除非设置了配置变量 pack.packSizeLimit。请注意,此选项可能会导致仓库更大且速度变慢;请参阅 pack.packSizeLimit 中的讨论。

--filter=<filter-spec>

从生成的 packfile 中删除匹配过滤器规范的对象,并将它们放入单独的 packfile 中。请注意,工作目录中使用的对象不会被过滤掉。因此,为了使拆分完全生效,最好在裸仓库中执行此操作,并与此选项一起使用 -a-d 选项。此外,还应使用 --no-write-bitmap-index(或将 repack.writeBitmaps 配置选项设置为 false),否则写入位图索引会失败,因为它假设只有一个 packfile 包含所有对象。请参阅 git-rev-list[1] 查看有效的 <filter-spec> 形式。

--filter-to=<dir>

将包含过滤掉对象的 pack 写入目录 <dir>。仅与 --filter 一起使用时有用。这可用于将 pack 放在通过 Git 备用机制访问的单独对象目录中。警告: 如果包含过滤掉对象的 packfile 不可访问,仓库可能会损坏,因为它可能无法访问该 packfile 中的对象。请参阅 gitrepository-layout[5] 中的 objectsobjects/info/alternates 部分。

-b
--write-bitmap-index

在 repack 中写入可达性位图索引。这仅在与 -a-A-m 一起使用时才有意义,因为位图必须能够引用所有可达对象。此选项会覆盖 repack.writeBitmaps 的设置。如果创建了多个 packfile,此选项将无效,除非写入 MIDX(在这种情况下,会创建多 pack 位图)。

--pack-kept-objects

在 repacking 时包含 .keep 文件中的对象。请注意,在 pack-objects 完成后,我们仍然不会删除 .keep pack。这意味着我们可能会复制对象,但这使得在并发推送或获取时该选项是安全的。此选项通常仅在您使用 -brepack.writeBitmaps 写入位图时才有用,因为它确保了位图 packfile 包含必需的对象。

--keep-pack=<pack-name>

从 repacking 中排除指定的 pack。这相当于在 pack 上有一个 .keep 文件。<pack-name> 是 pack 文件名,不包含前导目录(例如 pack-123.pack)。该选项可以指定多次以保留多个 pack。

--unpack-unreachable=<when>

在松开无法访问的对象时,不要松开早于 <when> 的任何对象。这可以用于优化掉任何将在后续 git prune 中立即被修剪的对象。

-k
--keep-unreachable

-ad 一起使用时,现有 pack 中的任何无法访问的对象将被追加到 packfile 的末尾,而不是被删除。此外,任何无法访问的松散对象将被打包(并删除其松散的对应物)。

-i
--delta-islands

--delta-islands 选项传递给 git-pack-objects,请参阅 git-pack-objects[1]

-g<factor>
--geometric=<factor>

排列生成的 pack 结构,使得每个连续的 pack 包含的对象数量至少是下一个最大 pack 的 <factor> 倍。

git repack 通过确定需要打包到一起的 packfile 的“切片”来确保这一点,以确保几何级数的增长。它选择最小的 packfile 集,以便尽可能多的较大的 packfile(按包含对象数量排序)可以保持不变。

与其他 repack 模式不同,要打包的对象集由需要组合起来以恢复几何级数的 pack 集唯一确定。

松散对象隐式包含在此“卷起”中,无论其可达性如何。这在未来可能会发生变化。

在写入多 pack 位图时,git repack 会选择最大的结果 pack 作为 MIDX 的对象选择首选 pack(请参阅 git-multi-pack-index[1])。

-m
--write-midx

写入一个包含非冗余 pack 的多 pack 索引(请参阅 git-multi-pack-index[1])。

--name-hash-version=<n>

将此参数传递给底层 git pack-objects 进程。请参阅 git-pack-objects[1] 以获取完整详细信息。

--path-walk

--path-walk 选项传递给底层 git pack-objects 进程。请参阅 git-pack-objects[1] 以获取完整详细信息。

配置

各种配置变量会影响打包,请参阅 git-config[1](搜索“pack”和“delta”)。

默认情况下,该命令将 --delta-base-offset 选项传递给 *git pack-objects*;这通常会产生稍小的 pack,但生成的 pack 与 1.4.4 版本以下的 Git 版本不兼容。如果您需要与如此古老的 Git 版本共享您的仓库,无论是直接还是通过 dumb http 协议,则需要将配置变量 repack.UseDeltaBaseOffset 设置为“false”并重新打包。在这种情况下,从旧 Git 版本通过本机协议访问不受此选项的影响,因为转换是按需进行的。

增量压缩不用于大于 core.bigFileThreshold 配置变量的对象,以及属性设置为 false 的文件(delta)。

GIT

Git[1] 套件的一部分