设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.50.1 无更改
-
2.50.0
2025-06-16
- 2.49.1 无更改
-
2.49.0
2025-03-14
- 2.43.1 → 2.48.2 无变更
-
2.43.0
2023-11-20
- 2.42.2 → 2.42.4 无更改
-
2.42.1
2023-11-02
- 2.39.1 → 2.42.0 无变更
-
2.39.0
2022-12-12
- 2.37.1 → 2.38.5 无变更
-
2.37.0
2022-06-27
- 2.35.1 → 2.36.6 无更改
-
2.35.0
2022-01-24
- 2.34.1 → 2.34.8 无更改
-
2.34.0
2021-11-15
- 2.33.1 → 2.33.8 无更改
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 无变更
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 无更改
-
2.31.0
2021-03-15
- 2.23.1 → 2.30.9 无变更
-
2.23.0
2019-08-16
- 2.20.1 → 2.22.5 无变更
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 无更改
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 无更改
-
2.18.0
2018-06-21
- 2.15.4 → 2.17.6 无更改
-
2.14.6
2019-12-06
- 2.11.4 → 2.13.7 无变更
-
2.10.5
2017-09-22
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.5.6 → 2.7.6 无变更
-
2.4.12
2017-05-05
- 2.1.4 → 2.3.10 无更改
-
2.0.5
2014-12-17
概要
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>]
描述
此命令用于将当前未存储在“包”(pack)中的所有对象组合成一个包。它还可以用于将现有包重新组织成一个更高效的包。
一个包是对象的集合,这些对象经过单独压缩,并应用了增量压缩,存储在单个文件中,并附带一个关联的索引文件。
包用于减少镜像系统、备份引擎、磁盘存储等的负载。
选项
- -a
-
不增量打包未打包的对象,而是将所有引用的内容打包到一个包中。当打包用于私人开发的仓库时特别有用。与
-d
一起使用。这将清理git
prune
留下的对象,但git
fsck
--full
--dangling
显示为悬空的对象。请注意,通过非智能协议(dumb protocols)获取的用户将不得不获取整个新包,以获取其中包含的任何对象,无论他们本地已经有多少该包中的其他对象。
承诺包文件(Promisor packfiles)将单独重新打包:如果存在关联“.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>
-
覆盖垃圾包的
--max-pack-size
。默认情况下继承--max-pack-size
的值(如果有)。有关更多详细信息,请参阅--max-pack-size
的文档。 - --combine-cruft-below-size=<n>
-
在生成垃圾包而不进行修剪时,仅重新打包大小严格小于 <n> 的现有垃圾包,其中 <n> 表示字节数,可选地可以带有“k”、“m”或“g”后缀。大小大于或等于 <n> 的垃圾包将保持原样不重新打包。当您希望避免在包含许多和/或大型不可达对象的仓库中重新打包大型垃圾包时,此选项非常有用。
- --expire-to=<dir>
-
将包含已修剪对象(如果有)的垃圾包写入目录 <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>
-
从生成的包文件中移除与过滤器规范匹配的对象,并将它们放入单独的包文件。请注意,工作目录中使用的对象不会被过滤掉。因此,为了使拆分完全生效,最好在裸仓库中执行此操作,并结合此选项使用
-a
和-d
选项。此外,应使用--no-write-bitmap-index
(或将repack.writebitmaps
配置选项设置为false
),否则写入位图索引将失败,因为它假定所有对象都在单个包文件中。有关有效的 <filter-spec> 形式,请参阅 git-rev-list[1]。 - --filter-to=<dir>
-
将包含已过滤对象的包写入目录 <dir>。仅与
--filter
一起使用时有用。这可用于将包放置在通过 Git 备用(alternates)机制访问的单独对象目录中。警告:如果包含已过滤对象的包文件无法访问,仓库可能会损坏,因为可能无法访问该包文件中的对象。请参阅 gitrepository-layout[5] 的objects
和objects/info/alternates
部分。 - -b
- --write-bitmap-index
-
在重新打包时写入可达性位图索引。这仅在与
-a
、-A
或-m
一起使用时有意义,因为位图必须能够引用所有可达对象。此选项会覆盖repack.writeBitmaps
的设置。如果创建了多个包文件,此选项将无效,除非写入 MIDX(在这种情况下会创建多包位图)。 - --pack-kept-objects
-
在重新打包时包含
.keep
文件中的对象。请注意,在pack-objects
完成后,我们仍然不会删除.keep
包。这意味着我们可能会复制对象,但这使得此选项在并发推送或拉取时可以安全使用。此选项通常仅在您使用-b
或repack.writeBitmaps
写入位图时才有用,因为它确保位图包文件具有必要的对象。 - --keep-pack=<pack-name>
-
从重新打包中排除给定的包。这相当于在包上有一个
.keep
文件。<pack-name> 是不带前导目录的包文件名(例如pack-123.pack
)。此选项可以指定多次以保留多个包。 - --unpack-unreachable=<when>
-
在松散不可达对象时,不要松散任何比 <when> 更旧的对象。这可用于优化写出任何会被后续
git
prune
立即修剪的对象。 - -k
- --keep-unreachable
-
与
-ad
一起使用时,现有包中的任何不可达对象将被附加到包文件末尾而不是被移除。此外,任何不可达的松散对象都将被打包(并移除其对应的松散对象)。 - -i
- --delta-islands
-
将
--delta-islands
选项传递给git-pack-objects
,请参阅 git-pack-objects[1]。 - -g<factor>
- --geometric=<factor>
-
安排生成的包结构,使每个连续的包包含的对象数量至少是下一个最大包的 <factor> 倍。
git
repack
通过确定需要重新打包成一个包以确保几何级数递进的包文件“切片”来确保这一点。它选择最小的包文件集合,以便尽可能多地保留较大的包文件(按该包中包含的对象数量计算)。与其他重新打包模式不同,要打包的对象集完全由正在“汇总”的包集决定;换句话说,是那些被确定需要合并以恢复几何级数递进的包。
松散对象隐式包含在此“汇总”中,而不考虑其可达性。这在未来可能会有所改变。
在写入多包位图时,
git
repack
选择最大的结果包作为 MIDX 对象选择的首选包(请参阅 git-multi-pack-index[1])。 - -m
- --write-midx
-
写入包含非冗余包的多包索引(请参阅 git-multi-pack-index[1])。
- --name-hash-version=<n>
-
将此参数提供给底层的
git
pack-objects
进程。有关详细信息,请参阅 git-pack-objects[1]。
配置
各种配置变量会影响打包,请参阅 git-config[1](搜索“pack”和“delta”)。
默认情况下,此命令将 --delta-base-offset
选项传递给 git pack-objects;这通常会生成稍小的包,但生成的包与 1.4.4 版本之前的 Git 不兼容。如果您需要直接或通过非智能 http 协议与这些旧版 Git 共享您的仓库,则需要将配置变量 repack.UseDeltaBaseOffset
设置为“false”并重新打包。旧版 Git 通过原生协议的访问不受此选项的影响,因为在这种情况下会根据需要即时执行转换。
对于大于 core.bigFileThreshold
配置变量的对象以及设置了 delta
属性为 false 的文件,不使用增量压缩。