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

名称

git-repack - Pack unpacked objects in a repository

概述

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

描述

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

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

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

选项

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

--cruft-expiration=<approxidate>

立即过期超过 <approxidate> 的不可访问对象,而不是等待下一次调用 git gc。 仅在使用 --cruft -d 选项时有用。

--max-cruft-size=<n>

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

--expire-to=<dir>

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

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

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

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

The default value for --window is 10 and --depth is 50. The maximum depth is 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"。允许的最小大小限制为 1MB。 如果指定,可能会创建多个数据包文件,这也会阻止位图索引的创建。 默认值是无限大,除非设置了配置变量 pack.packSizeLimit。请注意,该选项可能会导致版本库变大、变慢;请参阅 pack.packSizeLimit 中的讨论。

--filter=<过滤器定义>

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

--filter-to=<dir>

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

-b
--write-bitmap-index

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

--pack-kept-objects

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

--keep-pack=<pack-name>

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

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

-k
--keep-unreachable

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

-i
--delta-islands

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

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

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

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

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

Loose objects are implicitly included in this "roll-up", without respect to their reachability. This is subject to change in the future.

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

-m
--write-midx

编写包含非冗余软件包的多软件包索引(参见 git-multi-pack-index[1])。

配置

各种配置变量会影响打包,参见 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