git config pack.packSizeLimit的上限?

时间:2014-10-04 10:40:10

标签: windows git

我将配置放入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版本出了问题?

2 个答案:

答案 0 :(得分:1)

在git源代码中:

$ git grep -C 2 packsizelimit

[snippage]

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

  

版本2索引也可以处理大于4 Gb的打包文件。

包文件中的项目本身具有可变长度(基本上可能无限多位长)。所以这些都没关系,只要索引是版本2,就可以了。

因此,似乎如果off_t是64位并且cache.h被修改,那么在这里允许64位是可以的。但是,此类文件可能无法在32位受限系统上使用。或者,git可以使用int64_tgit_config_int64(此类型和此例程已经存在于git中),虽然我不清楚需要做多少工作以及如何与之交互其余的git内部。

此处值得注意的是git_config_ulong根据编译git的系统上unsigned long的大小强制执行限制,因此这意味着您的系统有32位long(或者至少支持32位长模型,你的git在其下编译)。


1 我不确定哪些系统(如果有的话)仍有32位off_t。我知道Linux首先开始支持off_t(32位)与loff_t(64位)的64位文件大小,但目前off_t__kernel_off_t的别名, long longarch/x86/include/uapi/asm/posix_types_x32.h的别名,longinclude/uapi/asm-generic/posix_types.h的别名。因此,它在至少一个32位系统上是64位,在64位long s的系统上是64位,但在32位long的系统上可能是32位s,如果他们没有使用long long变体。

在20世纪90年代,各种BSD直接恢复到64位。

SunOS / Solaris仍有32位off_t已有一段时间了;我不确定目前的情况。

答案 1 :(得分:0)

Torek的回答非常彻底,但简短的回答是......

如果您在git-cmd.bat提示符下键入gcc -v,则会看到

gcc version 4.4.0 (TDM-1 mingw32)

这意味着msysgit正在使用32位Mingw Gcc编译器进行编译。

这导致packfilesize的最大值为G ^当前编码方式的2 ^ 32或4GB。