Git推送时出现“错误:index-pack因信号9而死亡”的问题。

11
我看到了一些关于这个问题的类似 问题,但是还没有解决我的问题,所以我想再次询问。
我向一个已有git的项目中添加了许多新文件,并试图将它们推送上去。当我进行推送时,它会将它们压缩,然后写入,当它到达100%时,它会失败并显示以下错误:
error: index-pack died of signal 9 332.28 MiB | 5712 KiB/s   
error: pack-objects died with strange error
error: failed to push some refs to     '<username>@<my repo location'

我尝试过的事情:

  1. 去仓库,确保所有内容都可写,就像这里建议的那样

  2. 在.gitattributes文件中设置一些文件类型的binary -delta选项

  3. 将一些文件夹移出来(并使用git提交进行删除),以便稍后逐个添加它们。

我有点没有办法了... :/ 有任何建议吗?非常感谢任何建议——max

编辑-我后来发现这是由于dreamhost由于过度内存消耗而杀死了推送(我通过将我的应用程序文件夹复制到dreamhost上的repo服务器并从那里进行推送来完成此操作)。

找到了一些页面,-谈论了一个NO_MMAP=1选项在git中有助于防止这种情况,但是他们讨论时是关于安装git时配置git。我可以在现有的git安装中设置此选项吗?它是做推送的git-inited应用程序的配置的一部分还是存储库的配置的一部分?

编辑2-按照上面页面上的说明,我下载并制作了自己的本地git二进制文件,并设置了NO_MMAP=1选项。

我确保这些在我的路径中是在dreamhost安装的版本之前,并且"which git"显示我的本地版本,到目前为止都很好。但是,我遇到了完全相同的问题。
我需要在我的repo中做一些事情才能使NO_MMAP选项起作用,还是你认为问题出在其他地方?

2
你是否维护你正在尝试推送的主机?发送信号9是一个相当强烈的信号,你需要找出远程主机上是谁/什么在向index-pack进程发送该信号。检查机器上的dmesg/var/log的内容可能会揭示一些信息。 - Emil Sit
服务器使用的是哪个操作系统?你可以在Windows上使用procmon来查看文件系统中正在发生的情况,或者在Linux或类似系统上找出一种使用strace/ltrace的方法。 - John Weldon
@EmilSit - 作为一个实验,我刚刚将我的git应用程序文件夹复制到与存储库相同的服务器上,并更改了其配置以指向本地存储库文件夹,这样我的推送就只发生在服务器上,不需要任何http请求。结果出现了这个:天啊!你的一个进程(git,pid 7746)因过度使用资源而被杀死。请联系DreamHost支持获取详细信息。正如您所看到的,这是一个共享的DreamHost服务器(因此我的同事并没有完全拥有它,但他至少拥有那一部分)。 - Max Williams
1
可以推测,所讨论的资源是内存。有没有办法使推送过程使用更少的内存? - Max Williams
7个回答

8
有时由于负载问题,企业github也会出现这种情况。我发现一个好的方法是将克隆分成两个操作,这样可以减轻服务器的负担。
首先,进行浅克隆:git clone --depth 1 myRepo.git 接下来,进入克隆目录,并获取所有剩余的历史记录以进行完整的克隆:cd myRepo && git fetch --unshallow 如果您使用的是不支持--unshallow标志的旧版本git,则可以执行类似于git fetch --depth=1000000或其他适当大的数字。
有关更多替代方案,请参见此博客文章:https://blogs.atlassian.com/2014/05/handle-big-repositories-git/

6
Git在某些操作中需要较多的内存,以换取更好的磁盘或网络性能。例如,可以参考一些关于这个问题的讨论(请参见此其他SO问题)。
在这种情况下,我认为您和您的同事正在进行不同的成本权衡:您正在使用专业托管的Git托管服务(如GitHubBitBucket),而不是为了实现财务节省或其他方便(例如部署)。
如果您不愿意遵循您引用的维基/博客文章中提供的建议,请移至GitHub或Bitbucket(我认为这些文章提供了技术上准确的解决方案)。 Bitbucket提供免费无限制的私有存储库,因此没有真正的成本理由使用Dreamhost作为您的Git托管。
如果您需要某种部署解决方案来配合托管,则可以设计一些东西,将推送并自动更新工作目录以供Dreamhost托管,而不会产生在Dreamhost上托管Git存储库(以及所有历史记录)的全部成本。

谢谢Emil。你的答案(不是特指github,而是“离开dreamhost”)基本上就是我已经发现的。我通过将git仓库暂时移动到试图进行推送的同一台服务器上(非常麻烦)来解决了这个问题,并且在客户支持电子邮件之后,dreamhost实际上增加了我的内存限制,这很棒。但显然他们安装了一个新的procwatch守护进程,这是导致问题的罪魁祸首。 - Max Williams
谢谢你的建议。我增加了虚拟机的内存,问题得到了解决。 - greg
我确认这是与内存相关的问题。一台只有0.5GB内存的CI小型机器出现了这个问题。升级到1GB后,问题消失了。 - laconbass

3

Mac 用户

在我这种情况下,我使用了 brew install git 命令,这导致了与 xcode 自带的 git 冲突。

运行 brew uninstall git 命令可以解决这个问题。


那似乎是一个错误。Homebrew 中的 Git 可能比 Xcode 中的 Git 好得多。 - matt
是的,没错,但我认为这是因为某种方式安装了两个版本的git。 - Ben Winding
我在 Big Sur 更新后遇到了这个问题,当时我已经通过 Homebrew 安装了 Git。为了让它再次正常工作,我不得不重新安装 Xcode 命令行工具 并且 删除 Homebrew Git。 - Clay

1
我在卸载Xcode时遇到了这个问题。但是重新安装XCode并没有解决这个问题。然后通过运行brew uninstall git来修复它。

1
如果您正在使用Dreamhost服务器来保存裸仓库,您可以在本地添加和提交,然后将.git目录通过rsync同步到DH上。完成后,进入服务器的[存储库名称].git/config并将core.bare从false更改为true。
如果您想在服务器上使用工作树,则不确定应该怎么做,这对我来说还没有出现过。

0

我也遇到了这个错误。对我来说解决方案是增加服务器的内存容量。这样做后,错误就消失了。


0

我曾经遇到过这个问题,但是我的问题是由于Capfile的问题 - capistrano已经更新了,但是更改没有反映在Capfile中。

将Capfile更新到最新标准后解决了问题...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接