Git扩展:Win32错误487:cannot 't reserve space for cygwin's heap, Win32错误0

直到昨天,一切都很正常。

但是,当我试图使用git extensions提取一些存储库时,我突然得到这个错误

C:\Program Files\Git\bin\git.exe pull --progress "origin"
Done
0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
AllocationBase 0x0, BaseAddress 0x68560000, RegionSize 0x390000, State 0x10000
C:\Program Files\Git\bin\sh.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0

它发生在我克隆的所有存储库中。 但是,我的git bash工作正常。 我完全不知道发生了什么。知道为什么会这样吗?< / p >

179795 次浏览

Cygwin使用持久共享内存部分,有时可能会损坏。这种情况的症状是一些Cygwin程序开始失败,但其他应用程序不受影响。由于这些共享内存段是持久的,通常需要系统重新启动来清除它们才能解决问题。

如果重新启动没有纠正这个问题(正如Greg Hegwill的回答所建议的那样),那么检查您的PATH是否有冲突的msys-1.0.dll安装(可能还有其他相关的dll)。

在我的特殊情况下,MinGW的msys安装在其bin目录(<MinGW_Install_Path>\msys\1.0\bin)中有该DLL的副本,并且它列在PATH中。Git的cmd目录列在PATH中,但它的bin没有。(Git的msys-1.0.dll版本在bin目录下。显然,MSys-Git的默认安装不会将其bin添加到PATH中。)

一个临时的修复是将Git的bin目录添加到PATH中,这样它就会出现在MinGW的路径之前。(一个更永久的修复可能涉及整理MinGW的msys和Git之间的路径冲突和/或删除重复的msys安装。)

我在升级到git1.8.5.2后看到了同样的错误消息:

简单地搜索你的C:\驱动器上的所有msys-1.0.dll,并使Git使用的是第一个。

例如,在我的例子中,我简单地改变了顺序:

C:\prgs\Gow\Gow-0.7.0\bin\msys-1.0.dll
C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\msys-1.0.dll

通过将Git路径C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\放在我的%PATH%的前面,错误消息消失了。

不需要重启,甚至不需要更改DOS会话 一旦%PATH%在DOS会话中被更新,git命令就会工作


注意,carmbresterSixto赛都报告了下面(在评论中)必须重新启动以修复问题 注意:首先,还要删除任何msys-1.0.dll,比如%LOCALAPPDATA%

我在LPCEXpresso构建中遇到过这个问题。如果在PATH中有C:\MinGW\bin。不知何故,我不得不删除它来摆脱这个问题,因为其他一些MinGW喜欢基于

我也有同样的问题。我在这里找到了解决方案http://jakob.engbloms.se/archives/1403

c:\msysgit\bin>rebase.exe -b 0x50000000 msys-1.0.dll

对我来说,解决方案略有不同。这是

C:\Program Files (x86)\Git\bin>rebase.exe -b 0x50000000 msys-1.0.dll

在你重基dll之前,你应该确保它没有被使用:

tasklist /m msys-1.0.dll

备份:

copy msys-1.0.dll msys-1.0.dll.bak

如果rebase命令失败,如下所示:

ReBaseImage (msys-1.0.dll)失败,最后错误= 6

您需要依次执行以下步骤:

  1. 将dll复制到另一个目录
  2. 使用上面的命令改变副本的基础
  3. 用副本替换原来的dll。

如果有任何问题,运行命令管理员

我今天碰到了这个。在Greg Hewgill的回答引导下,我查看了系统上正在运行的进程,看看是否有什么东西“卡住”了,或者是否有其他用户登录到机器上使用git做了任何事情。然后在这台特定的机器上启动cygwin(单独安装)。发射顺利。我关闭它,然后再次尝试Git扩展(我尝试拉操作),它工作了。不确定cygwin的启动是否清除了共享的一些东西,但这是我第一次遇到这个错误,这似乎为我修复了它。

为了解决这个问题,我简单地让Tortoise Git安装了更新。

我也有同样的问题,在一些Windows 8.0崩溃和更新后,在msys git 1.9。我没有在我的路径中找到任何msys/git,所以我只是在windows本地用户环境设置中添加了它。它无需重新启动就能工作。

基本上,类似于roberb,但我没有任何 git/msys在我的路径。

顺便说一句:

  1. 我尝试使用rebase -b blablabla msys.dll,但有错误“ReBaseImage (msys-1.0.dll)失败,最后错误= 6”

  2. 如果你需要这个很快,没有时间调试,我注意到“Git Bash”。Git目录下的vbs成功启动bash shell。

这个错误在我的Windows机器上很少发生。我最终重启了机器,错误消失了。

dr:安装64位Git for Windows 2


技术细节

      0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
AllocationBase 0x0, BaseAddress 0x68570000, RegionSize 0x2A0000, State 0x10000
PortableGit\bin\bash.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0

此症状本身与可执行文件的映像库、损坏的Cygwin共享内存部分、dll版本冲突等无关。

Cygwin代码未能在这个固定地址0x68570000处为堆分配约5 MB的大内存块,而那里显然只有约2.5 MB的大洞可用。相关代码可以在msysgit源中看到。


为什么这部分地址空间不是空闲的?

原因有很多。在我的情况下,它是一些其他模块加载在一个冲突的地址:

Process modules in Process explorer .

最后一个地址大约是0x68570000 + 5 MB = 0x68C50000,但是这些wow64相关的dll从0x68810000以上加载,这阻碍了分配。

每当有一些共享DLL时,Windows通常会尝试在所有进程中以相同的虚拟地址加载它,以节省一些重定位处理。这只是一个坏运气的问题,这些系统组件以某种方式加载在一个冲突的地址这一次


为什么你的Git里有Cygwin ?

因为Git是一个丰富的套件,由一些低级命令和许多有用的实用程序组成,并且主要是在类unix系统上开发的。为了能够在不进行大量重写的情况下构建和运行它,它至少需要一个部分类unix的环境。

为了实现这一点,人们发明了MinGW和MSYS——它们是在Windows上以类似unix的方式开发程序的最小构建工具集。MSYS还包含一个共享库,这个msys-1.0.dll,它有助于在运行时解决两个平台之间的一些兼容性问题。其中的许多部分都是从Cygwin那里获得的,因为有人已经在那里解决了同样的问题。

所以不是Cygwin,而是MinGW的运行时DLL行为异常。

在Cygwin中,这段代码实际上与MSYS 1.0相比有了很大的变化——该文件的最后一个提交消息说“Import Cygwin 1.3.4”,这是从2001年开始的!

当前CygwinMSYS的新版本 - MSYS2都已经有了不同的逻辑,希望更加健壮。它只是旧版本的Git for Windows,仍然是使用旧的破碎的MSYS系统构建的。


清洁解决方案:

  • 安装Git for Windows 2——它是用新的妥善维护MSYS2构建的,也有许多新特性,大量的bug修复,安全改进等等。如果可能的话,也建议使用64位版本。但是对于32位系统,变基工作区是在幕后自动执行的,因此在那里发生问题的几率也应该较低。
  • 简单地重新启动计算机来清理地址空间(将这些模块加载到不同的随机地址)可能可以工作,但实际上,如果没有其他事情,只需升级到Windows 2的Git来获得安全补丁。

出租汽车司机解决方案:

  • 改变PATH有时可以工作,因为在不同版本的Git或其他基于msys的应用程序中可能有不同版本的msys-1.0.dll,这些应用程序可能使用不同的地址,不同的堆大小等。
  • 重基msys-1.0.dll可能是浪费时间,因为1)作为一个DLL,它已经有重定位信息;“在任何版本的Windows操作系统中,都不能保证(…)DLL将始终加载在相同的地址空间"无论如何()。这可以帮助的唯一方法是,如果msys-1.0.dll本身在它试图使用的冲突地址加载。显然,有时情况就是这样,因为这就是Git for Windows的家伙在32位系统上自动做的事情。
  • 考虑到上面的发现,我最初修补了msys-1.0.dll二进制文件,为_cygheap_start使用不同的值,这立即解决了问题。

非常简单的rebase解决方案:

进入安装git的文件夹,例如:

C:\Program Files (x86)\Git\bin

通过按住shift键并右键单击文件夹,你应该能够以管理员身份从那里打开命令提示符(感谢https://stackoverflow.com/users/355389/darren-lewis的注释),

然后运行:

rebase.exe -b 0x50000000 msys-1.0.dll

当重启方法不起作用时,这为我解决了问题。

希望能有所帮助。

C:\msysgit\bin>rebase.exe -b 0x50000000 msys-1.0.dll

删除旧版本的%USERPROFILE%\AppData\Local\SourceTree\app-x.xX为我工作。不知道它是如何连接到命令行git…

只是想在这里分享我的经验。我在Windows 64位机器上为MTK平台进行交叉编译时遇到了同样的问题。MinGW和MSYS在构建过程中出现了这个问题。我通过改变msys-1.0.dll文件解决了这个问题。rebase.exe和系统重启都不适合我。

因为我的电脑上没有安装rebase.exe。我安装了cygwin64,并在里面使用了rebase.exe:

C:\cygwin64\bin\rebase.exe -b 0x50000000 msys-1.0.dll

虽然改基看起来很成功,但错误仍然存在。然后我在Cygwin64终端内运行rebase命令,得到一个错误:

$ rebase -b 0x50000000 msys-1.0.dll
rebase: Invalid Baseaddress 0x50000000, must be > 0x200000000

后来我试了几个地址,但都不行。所以我最终改变了msys-1.0.dll文件,它解决了这个问题。

克服恼人的堆错误的一个妙招是启用“遗留控制台”;命令行模式。它提供了对其他api的访问,这些api在后来的windows版本中受到限制,因此内存分配工作得更好