Git
简体中文 ▾ Topics ▾ Latest version ▾ git-repack last updated in 2.43.2

名称

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

概述

git repack [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m] [--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<包名>] [--write-midx]

描述

This command is used to combine all objects that do not currently reside in a "pack", into a pack. It can also be used to re-organize existing packs into a single, more efficient pack.

压缩包是对象的集合,单独压缩,应用 delta 压缩,存储在单个文件中,并带有相关索引文件。

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

选项

-a

Instead of incrementally packing the unpacked objects, pack everything referenced into a single pack. Especially useful when packing a repository that is used for private development. Use with -d. This will clean up the objects that git prune leaves behind, but git fsck --full --dangling shows as dangling.

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

Promisor 包文件将单独重新打包:如果有的包文件有一个相关的 ".promisor " 文件,这些包文件将被重新打包到另一个单独的包中,并写入一个与新的单独包相对应的空 ".promisor " 文件。

-A

Same as -a, unless -d is used. Then any unreachable objects in a previous pack become loose, unpacked objects, instead of being left in the old pack. Unreachable objects are never intentionally added to a pack, even when repacking. This option prevents unreachable objects from being immediately deleted by way of being left in the old pack and then removed. Instead, the loose unreachable objects will be pruned according to normal expiry rules with the next git gc invocation. See git-gc[1].

-d

After packing, if the newly created packs make some existing packs redundant, remove the redundant packs. Also run git prune-packed to remove redundant loose object files.

--cruft

-a 相同,除非使用了 -d。然后,任何无法访问的对象都会被打包到一个单独的压缩包中。无法访问的对象可以在下一次调用 git gc 时使用正常的过期规则进行剪枝(参见 git-gc[1])。与 -k 不兼容。

--cruft-expiration=<近似值>

Expire unreachable objects older than <approxidate> immediately instead of waiting for the next git gc invocation. Only useful with --cruft -d.

--max-cruft-size=<n>

在创建新的数据包之前,会先将 Cruft 物件重新打包到大小为 <n> 字节的数据包中。只要有足够的小于 <n> 的 Cruft 包,重新打包将导致创建一个新的 Cruft 包,其中包含来自任何合并 Cruft 包的对象,以及任何新的无法访问的对象。大于 <n> 的压缩包不会被修改。当新的 Cruft 包大于 <n> 字节时,它将被拆分成多个包,所有包的大小保证最多为 <n> 字节。仅在使用 --cruft -d 时有用。

--expire-to=<目录>

将包含修剪对象(如果有)的压缩包写入目录 <路径>。该选项可用于在单独的目录中保留剪枝对象的副本作为备份。仅在使用 --cruft -d 时有用。

-l

git pack-objects 传递 --local 选项。参见 git-pack-objects[1]

-f

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

-F

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

-q
--quiet

在标准错误流中不显示进度,并向 git pack-objects 传递 -q 选项。参见 git-pack-objects[1]

-n

Do not update the server information with git update-server-info. This option skips updating local catalog files needed to publish this repository (or a direct copy of it) over HTTP or FTP. See git-update-server-info[1].

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

这两个选项会影响如何使用 delta 压缩来存储数据包中的对象。对象首先会按类型、大小和可选名称进行内部排序,然后与 --window`中的其他对象进行比较,以确定使用 delta 压缩是否能节省空间。--depth` 限制了 delta 深度的最大值;过深会影响解包器的性能,因为需要多次应用 delta 数据才能找到所需的对象。

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

--threads=<n>

该选项将传递给 git pack-objects

--window-memory=<n>

This option provides an additional limit on top of --window; the window size will dynamically scale down so as to not take up more than <n> bytes in memory. This is useful in repositories with a mix of large and small objects to not run out of memory with a large window, but still be able to take advantage of the large window for the smaller objects. The size can be suffixed with "k", "m", or "g". --window-memory=0 makes memory usage unlimited. The default is taken from the pack.windowMemory configuration variable. Note that the actual memory usage will be the limit multiplied by the number of threads used by git-pack-objects[1].

--max-pack-size=<n>

Maximum size of each output pack file. The size can be suffixed with "k", "m", or "g". The minimum size allowed is limited to 1 MiB. If specified, multiple packfiles may be created, which also prevents the creation of a bitmap index. The default is unlimited, unless the config variable pack.packSizeLimit is set. Note that this option may result in a larger and slower repository; see the discussion in pack.packSizeLimit.

--filter=<过滤器定义>

Remove objects matching the filter specification from the resulting packfile and put them into a separate packfile. Note that objects used in the working directory are not filtered out. So for the split to fully work, it’s best to perform it in a bare repo and to use the -a and -d options along with this option. Also --no-write-bitmap-index (or the repack.writebitmaps config option set to false) should be used otherwise writing bitmap index will fail, as it supposes a single packfile containing all the objects. See git-rev-list[1] for valid <filter-spec> forms.

--filter-to=<目录>

将包含筛选出的对象的数据包写入目录 <目录>。仅在使用 --filter 时有用。这可用于将数据包放在通过 Git 替代机制访问的单独对象目录中。警告: 如果包含过滤掉的对象的包文件无法访问,则 repo 可能会损坏,因为可能无法访问该包文件的对象。请参阅 gitrepository-layout[5]objectsobjects/info/alternates 部分。

-b
--write-bitmap-index

作为重新打包的一部分,写入可达性位图索引。这只有在与 -a-A-m 参数一起使用时才有意义,因为位图必须能够指向所有可达对象。此选项会覆盖 repack.writeBitmaps 的设置。如果创建了多个包文件,此选项将不起作用,除非正在写入一个 MIDX(在这种情况下将创建一个多包位图)。

--pack-kept-objects

Include objects in .keep files when repacking. Note that we still do not delete .keep packs after pack-objects finishes. This means that we may duplicate objects, but this makes the option safe to use when there are concurrent pushes or fetches. This option is generally only useful if you are writing bitmaps with -b or repack.writeBitmaps, as it ensures that the bitmapped packfile has the necessary objects.

--keep-pack=<包名>

Exclude the given pack from repacking. This is the equivalent of having .keep file on the pack. <pack-name> is the pack file name without leading directory (e.g. pack-123.pack). The option can be specified multiple times to keep multiple packs.

--unpack-unreachable=<何时>

当松动无法访问的对象时,不要费心松动任何早于 <时候>`的对象。这可以用来优化写入对象的过程,因为后续的 `git prune 会立即剪枝这些对象。

-k
--keep-unreachable

-ad 一起使用时,现有数据包中任何无法访问的对象将被附加到数据包文件的末尾,而不是被移除。此外,任何无法访问的松散对象也将被打包(并移除其松散对应对象)。

-i
--delta-islands

git-pack-objects 传递 --delta-islands 选项,参见 git-pack-objects[1]

-g<条件>
--geometric=<条件>

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

git repack 通过 “切割” 需要重新打包成一个的文件包来确保几何级数的增长。它会挑选最小的文件包集合,以便尽可能多地保留较大的文件包(按该文件包所含对象的数量计算)。

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

松散对象隐含在此 “滚动” 中,而不考虑它们的可达性。今后可能会有变化。

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

-m
--write-midx

Write a multi-pack index (see git-multi-pack-index[1]) containing the non-redundant packs.

配置

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

默认情况下,该命令会在 git pack-objects 中传递 --delta-base-offset 选项;这通常会导致生成的数据包略小,但生成的数据包与版本 1.4.4 以上的 Git 版本不兼容。如果你需要直接或通过笨重的 http 协议与这些古老的 Git 版本共享你的仓库,那么你需要将配置变量 repack.UseDeltaBaseOffset 设为 "false",然后重新打包。通过本地协议访问旧版本的 Git 不受此选项影响,因为在这种情况下,转换是根据需要即时进行的。

对于大于 core.bigFileThreshold 配置变量的对象和属性 delta 设置为 false 的文件,不会使用 Delta 压缩。

GIT

属于 git[1] 文档

scroll-to-top