Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
- 2.43.0 11/20/23
- 2.42.1 11/02/23
- 2.39.1 → 2.42.0 no changes
- 2.39.0 12/12/22
- 2.37.1 → 2.38.5 no changes
- 2.37.0 06/27/22
- 2.35.1 → 2.36.6 no changes
- 2.35.0 01/24/22
- 2.34.1 → 2.34.8 no changes
- 2.34.0 11/15/21
- 2.33.1 → 2.33.8 no changes
- 2.33.0 08/16/21
- 2.32.1 → 2.32.7 no changes
- 2.32.0 06/06/21
- 2.31.1 → 2.31.8 no changes
- 2.31.0 03/15/21
概述
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] 的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>
-
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] 文档