Git
英语 ▾ 主题 ▾ 最新版本 ▾ git-repack 最后更新于 2.43.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]

描述

此命令用于将当前未驻留在“包”中的所有对象合并到一个包中。它还可以用于将现有包重新组织到一个更有效率的单一包中。

包是一组对象,每个对象都单独压缩,并应用了增量压缩,存储在一个文件中,并附带一个关联的索引文件。

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

选项

-a

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

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

Promisor 包文件将分别重新打包:如果存在具有关联“.promisor”文件的包文件,这些包文件将重新打包到另一个单独的包中,并且将写入与新单独包对应的空“.promisor”文件。

-A

-a 相同,除非使用 -d。然后,先前包中的任何不可达对象将成为松散的、未打包的对象,而不是保留在旧包中。不可达对象从不故意添加到包中,即使在重新打包时也是如此。此选项可防止通过保留在旧包中然后删除的方式立即删除不可达对象。相反,松散的不可达对象将在下次 git gc 调用时根据正常的过期规则被修剪。请参见 git-gc[1]

-d

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

--cruft

-a 相同,除非使用 -d。然后,任何不可达对象都将打包到一个单独的 cruft 包中。不可达对象可以使用正常的过期规则在下次 git gc 调用时进行修剪(请参见 git-gc[1])。与 -k 不兼容。

--cruft-expiration=<approxidate>

立即过期比 <approxidate> 更旧的不可达对象,而不是等待下次 git gc 调用。仅适用于 --cruft -d

--max-cruft-size=<n>

在创建新包之前,将 cruft 对象重新打包到大小为 <n> 字节的包中。只要有足够的 cruft 包小于 <n>,重新打包就会导致创建一个包含任何组合的 cruft 包中的对象以及任何新的不可达对象的新 cruft 包。大于 <n> 的 cruft 包将不会被修改。当新 cruft 包大于 <n> 字节时,它将被拆分为多个包,所有这些包都保证最大为 <n> 字节。仅适用于 --cruft -d

--expire-to=<dir>

将包含已修剪对象(如果有)的 cruft 包写入目录 <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>

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

--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>

每个输出包文件的最大大小。大小可以用“k”、“m”或“g”作为后缀。允许的最小大小限制为 1 MiB。如果指定,则可能创建多个包文件,这也将阻止创建位图索引。默认情况下,大小不受限制,除非设置了配置变量 pack.packSizeLimit。请注意,此选项可能会导致更大的存储库,速度也更慢;请参见 pack.packSizeLimit 中的讨论。

--filter=<filter-spec>

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

--filter-to=<dir>

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

-b
--write-bitmap-index

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

--pack-kept-objects

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

--keep-pack=<pack-name>

排除给定 packfile 从重新打包。这等效于在 packfile 上有 .keep 文件。<pack-name> 是 packfile 名,不带前导目录(例如 pack-123.pack)。可以多次指定此选项以保留多个 packfile。

--unpack-unreachable=<when>

在松开不可达对象时,不要费心松开任何比 <when> 更旧的对象。这可用于优化掉任何将被后续 git prune 立即修剪的对象的写入。

-k
--keep-unreachable

在与 -ad 一起使用时,来自现有 packfile 的任何不可达对象将被追加到 packfile 的末尾,而不是被删除。此外,任何不可达的松散对象都将被打包(并删除其松散对应物)。

-i
--delta-islands

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

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

安排生成的 packfile 结构,以便每个后续的 packfile 包含的对象数量至少是下一个最大的 packfile 的 <factor> 倍。

git repack 通过确定需要重新打包成一个的 packfile 的“分割点”来确保这一点,以确保几何级数。它选择最小的 packfile 集合,以便尽可能多的较大 packfile(根据该 packfile 中包含的对象数量)可以保持不变。

与其他重新打包模式不同,要打包的对象集由要“卷起”的 packfile 集唯一确定;换句话说,为了恢复几何级数而确定需要组合的 packfile 集。

松散对象隐式地包含在“卷起”中,不考虑其可达性。这可能会在将来发生变化。

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

-m
--write-midx

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

配置

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

默认情况下,该命令将 --delta-base-offset 选项传递给 git pack-objects;这通常会导致 packfile 更小,但生成的 packfile 与早于版本 1.4.4 的 Git 版本不兼容。如果您需要直接或通过哑 HTTP 协议与这些古老的 Git 版本共享您的仓库,那么您需要将配置变量 repack.UseDeltaBaseOffset 设置为“false”并重新打包。通过原生协议从旧版本 Git 访问不受此选项的影响,因为在这种情况下,转换是在需要时动态执行的。

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

Git

git[1] 套件的一部分

scroll-to-top