我触发了这个命令:
git push origin master
我得到了这个结果:
Counting objects: 15626, done.
Delta compression using up to 4 threads.
error: pack-objects died of signal 967
error: pack-objects died with strange error
没有信号编号 967,但有一个信号编号 9,在 Linux 和 Unix 系统上SIGKILL
。 我认为有什么东西印了一行以67
结尾,然后是回车,然后你当地的git pack-objects
被"OOM 杀手"击中了。
你需要做的是给你的 Linux 系统(这是你的系统,而不是你要推送的系统(更多的内存,或者推送更小的提交(或两者兼而有之(。 在这种情况下,"内存"可以是真实的、物理的 RAM 或虚拟内存:交换空间,您的系统可以从占用内存的大多数空闲程序中写入其他空闲的内存内容。 为了获得更多的物理内存,您当然可以安装更多的 DRAM 芯片;或者,您可以退出任何不需要继续运行的占用内存的程序。
你也可以调整 Git 的内存使用设置,这样进行对象压缩需要更少的内存,但通常没有充分的理由这样做(除非你有一个非常旧的 Git:较新的版本检测到巨大的二进制文件,甚至不尝试压缩它们(。
详
当 Git 执行推送时,您通常会看到以下内容:
Counting objects: nnnnn, done.
和:
Compressing objects: nn% (mmmmm/nnnnn)
进度消息,向您保证 Git 实际上正在执行某些操作,否则可能会长时间暂停。 这些来自git pack-objects
,git push
运行它来制作 Git 所谓的精简包,以发送到您要将数据推送到的其他 Git。
您的 Git 实际上完成了"计数对象"阶段,并进入了"压缩对象"阶段,这更占用内存。
所以,git pack-objects
愉快地打印进度线:
Compressing objects: xx% (xxxxx/xxx69)
它将光标发送回每次打印输出后的行首,以便下一行覆盖前一行,因此最终它会说"100% (nnnnn/nnnnn(,完成"。 (一旦到达这一点,它就会打印一个换行符,而不仅仅是回车符。
可悲的是,在这一点上,Linux(或你正在使用的任何系统(认为太多的程序使用了太多的内存,并选择git pack-objects
作为其内存不足的受害者。 它用SIGKILL
杀死了git pack-objects
,信号9。
这使您的推送打印:
error: pack-objects died of signal 9
在上一个进度行的顶部,离开:
error: pack-objects died of signal 967)
(注意:我不知道所有x
-s的数字是什么,除了它们必须以67
结尾。 错误消息不以remote:
为前缀,但应以signal 967)
结尾(即带有右括号的字符串(,而不仅仅是signal 967
(。
OOM 杀手意味着您的系统内存不足。 它选择git pack-objects
作为受害者的事实并不一定意味着git pack-objects
本身就是您的系统内存不足的原因。这只是系统在超满的鱼缸中看到的最大的鱼。 Linux选择取出那条鱼,而不是取出五条小鱼。