Git Extensions:Win32错误487:无法为cygwin的堆保留空间,Win32错误0

Uch*_*chi 340 git cygwin git-extensions

Git Extensions:一切都很好,直到昨天.

但突然间,当我尝试使用某些存储库时,我会收到此错误 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
Run Code Online (Sandbox Code Playgroud)

我克隆的所有存储库都在发生这种情况.但是,我的git bash工作正常.我不知道发生了什么.知道为什么会这样吗?

zai*_*eer 379

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

c:\msysgit\bin>rebase.exe -b 0x50000000 msys-1.0.dll
Run Code Online (Sandbox Code Playgroud)

对我来说,解决方案略有不同.它是

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

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

tasklist /m msys-1.0.dll
Run Code Online (Sandbox Code Playgroud)

做一个备份:

copy msys-1.0.dll msys-1.0.dll.bak
Run Code Online (Sandbox Code Playgroud)

如果rebase命令失败,例如:

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

您需要按顺序执行以下步骤:

  1. 将dll复制到另一个目录
  2. 使用上面的命令重新复制副本
  3. 用副本替换原始dll.

如果有任何问题以管理员身份运行命令

  • 这对我来说很有用,没有重启或其他任何东西. (25认同)
  • @TheJKFever您需要在管理员的命令提示符下运行它,因为它将修改msys-1.0.dll.首先备份dll,将其复制到msys-1.0.dll.bak,然后以管理员身份运行该命令.它对我有用. (17认同)
  • 我git这个错误ReBaseImage(msys-1.0.dll)失败,最后一个错误= 6 (8认同)
  • 这对我有用!以管理员身份运行CMD - 无需重启 (6认同)
  • 我在Win10 64位Pro上没有rebase.exe,但是调用以下命令就可以了(VS2010):“ C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ editbin.exe “ / REBASE:BASE = 0x50000000 msys-1.0.dll (2认同)

Gre*_*ill 229

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

  • 是不是有一个可以终止以释放内存的可执行文件?完整的系统重启似乎有点矫枉过正.此外,下面的答案(http://stackoverflow.com/a/31970708/88409)解释了问题的真正原因,它与损坏的内存无关. (6认同)

Yir*_*kha 135

tl; dr:为Windows 2安装64位Git.


技术细节

      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
Run Code Online (Sandbox Code Playgroud)

这种症状本身与可执行文件的图像库,Cygwin的共享内存部分损坏,DLL的冲突版本等无关.

这是Cygwin代码在这个固定地址0x68570000处没有为其堆分配大约5 MB的大块内存,而那里只有一个大约2.5 MB的大洞.相关代码可以在msysgit源代码中看到.


为什么地址空间的那部分不是免费的?

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

Process explorer中的流程模块

最后一个地址大约是0x68570000 + 5 MB = 0x68C50000,但是这些与WOW64相关的DLL从0x68810000向上加载,这阻止了分配.

每当存在一些共享DLL时,Windows通常会尝试在所有进程中的同一虚拟地址加载它以节省一些重定位处理.这只是一个运气不好的事,这些系统组件得到了某种程度上加载在冲突地址这段时间.


为什么你的Git中有Cygwin?

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

为了实现这一目标,人们发明了MinGW和MSYS--一种最小的构建工具集,可以像Unix一样在Windows上开发程序.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系统构建.


清洁解决方案

  • 安装适用于Windows 2的Git - 它是使用新的,正确维护的MSYS2构建的,并且还具有许多新功能,大量错误修复,安全性改进等.如果可能的话,还建议使用64位版本.但是,对于32位系统,rebase解决方法是在幕后自动执行的,因此问题发生的可能性也应该降低.
  • 只需重新启动计算机来清理地址空间(在不同的随机地址加载这些模块)可能会有效,但实际上,只需升级到Git for Windows 2即可获得安全修复程序.

Hacky解决方案:

  • 更改PATH有时可以工作,因为msys-1.0.dll在不同版本的Git或其他基于MSYS的应用程序中可能存在不同版本,这些应用程序可能使用不同的地址,此堆的不同大小等.
  • 重新绑定msys-1.0.dll可能是浪费时间,因为1)作为DLL,它已经具有重定位信息和2)"在任何版本的Windows OS中,不能保证(...)DLL将始终在相同的地址空间加载"无论如何(来源).这可以帮助的唯一方法是,如果它msys-1.0.dll自己加载在它正在尝试使用的冲突地址.显然有时就是这种情况,因为这就是Git for Windows的人在32位系统上自动执行的操作.
  • 考虑到上面的发现,我最初二进制修补msys-1.0.dll二进制文件使用不同的值,_cygheap_start并立即解决了问题.

  • 完美,记录良好的答案!并且是对问题的适当永久解决方案,而不是当前接受的答案. (3认同)
  • 谢谢,很高兴知道.我正在使用与git-extensions捆绑在一起的版本,无论是什么.重新启动修复它,所以我会忽略它,直到更新结束我的方式.:-) (2认同)
  • 关于这个问题的更多细节 - https://github.com/git-for-windows/git/wiki/32-bit-issues (2认同)

Tis*_*sch 32

非常简单的rebase解决方案:

转到安装git的文件夹,例如:

C:\Program Files (x86)\Git\bin
Run Code Online (Sandbox Code Playgroud)

通过在文件夹中按住shift并右键单击,您应该可以从那里以管理员身份打开命令提示符(感谢/sf/users/2487691/​​9/darren-lewis为该评论),

然后运行:

rebase.exe -b 0x50000000 msys-1.0.dll
Run Code Online (Sandbox Code Playgroud)

当重启方法不起作用时,这为我修复了它.

希望能帮助到你.


Von*_*onC 12

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

只需msys-1.0.dll在您的C:\驱动器上搜索所有内容,并使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
Run Code Online (Sandbox Code Playgroud)

通过使Git路径C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\成为我的第一个%PATH%,错误消息消失了.

无需重启或甚至更改DOS会话.
一旦%PATH%在该DOS会话中更新,git命令就可以正常工作.


请注意,carmbresterSixto Saez都在下面(在评论中)报告必须重新启动才能解决问题.
注意:首先,还要删除任何内容msys-1.0.dll,例如%LOCALAPPDATA%

  • 我的路径中的其他任何地方都没有 msys-1.0.dll,但看起来您是对的 - 将我的路径的 git 部分移到列表中更高的位置确实解决了我的问题。谢谢你!- 厌倦了重新启动来修复。 (2认同)

Rob*_*rtB 7

如果重新启动无法解决问题(如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安装.)