将配置放入 1.9.4.msysgit.2
后:
git config --global pack.packsizelimit 5g
我收到这样的错误:
$ git log
fatal: bad numeric config value '5g' for 'pack.packsizelimit' in c:/Users/Danny/.gitconfig: out of range
经过多次测试,我发现该值不能超过4GB。即接受“3g”、“4095m”、“4194303k”,而拒绝“4g”、“4096m”、“4194304k”。
但是文档说 pack.packsizelimit 的默认值是无限制的,4GB 限制似乎没有道理。
有人知道 pack.packsizelimit 是否有与其他配置相关的上限吗?或者这是一个硬编码的上限?或者我的git版本有问题?
最佳答案
在git源代码中:
$ git grep -C 2 packsizelimit
[片段]
config.c: if (!strcmp(var, "pack.packsizelimit")) {
config.c- pack_size_limit_cfg = git_config_ulong(var, value);
[和]
fast-import.c: if (!strcmp(k, "pack.packsizelimit")) {
fast-import.c- max_packsize = git_config_ulong(k, v);
因此该限制是由 git_config_ulong
强制执行的;下一个问题是:应该这样吗?
此实例必须是:
cache.h:extern unsigned long pack_size_limit_cfg;
但是这个:
fast-import.c:static off_t max_packsize;
具有类型off_t
,通常为1 64 位。包文件格式本身怎么样?这里的答案比较模糊,但是the Git Book says :
Version 2 indexes can also handle packfiles larger than 4 Gb.
包文件本身中的项目具有可变长度(本质上可能是无限多位长)。所以这些都可以,只要索引是版本2就可以了。
因此,如果 off_t
是 64 位,并且如果 cache.h
被修改,那么这里允许 64 位就可以了。但是,此类文件可能无法在 32 位限制的系统上使用。或者,git 可以使用 int64_t
和 git_config_int64
(这种类型和这个例程已经存在于 git 中),尽管我不清楚这需要多少工作以及如何进行与 git 内部的其余部分交互。
这里还值得注意的是,git_config_ulong
根据编译 git 的系统上 unsigned long
的大小强制执行限制,因此这意味着您的系统有32位长
(或者至少支持32位长模型,你的git是在该模型下编译的)。
1我不确定哪些系统(如果有)仍然具有 32 位 off_t
。我知道 Linux 首先开始通过 off_t
(32 位)与 loff_t
(64 位)支持 64 位文件大小,但目前 off_t
是__kernel_off_t
的别名,它是 arch/x86/include/uapi/asm/posix_types_x32.h
中 long long
的别名,或者是include/uapi/asm-generic/posix_types.h
中的 long
。因此,它在至少一个 32 位系统上是 64 位,在具有 64 位 long
的系统上是 64 位,但在具有 32 位 long
的系统上可能是 32 位code>s,如果它们不使用 long long
变体。
早在 20 世纪 90 年代,各种 BSD 就直接转向 64 位。
SunOS/Solaris 在相当长一段时间内仍然保留 32 位 off_t
;我不确定目前的情况。
关于windows - git config pack.packSizeLimit 的上限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26191985/