我将配置放入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版本出了问题?
答案 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_t
和git_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 long
中arch/x86/include/uapi/asm/posix_types_x32.h
的别名,long
中include/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。