git – Git扩展:Win32错误487:无法为cygwin的堆保留空间,Win32错误0

问题:

Git扩展:直到昨天一切正常。

但是当我尝试使用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运行正常。 我不知道发生了什么。 知道为什么会这样吗?

Git Extensions: Everything was working fine until yesterday.But suddenly I am get this error when I try to pull some repositories using git extensionsIt is happening for all the repositories which I have cloned.But, my git bash is working fine.I don’t have any idea what is going on.Any idea as to why this is happening?

解决方案:

方案1:

我有同样的问题。 我在这里找到了解决方案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。

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

方案2:

Cygwin使用永久共享内存部分,该部分有时可能会损坏。 其症状是某些Cygwin程序开始失败,但其他应用程序不受影响。 由于这些共享内存部分是持久性的,因此通常需要重新引导系统才能清除它们,然后才能解决问题。

方案3:

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

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

Cygwin代码无法在此固定地址0x68570000为其堆分配约5 MB的大内存块,而那里显然只有约2.5 MB的空洞。 相关代码可以在msysgit源代码中看到。


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

可能有很多原因。 就我而言,这是在冲突的地址处加载了其他一些模块:

Process Explorer中的过程模块

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

只要有共享的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年开始的!

当前的Cygwin新版本的MSYS -MSYS2-都已具有不同的逻辑,希望它更健壮。 这只是Git for Windows的旧版本,仍然使用旧的损坏的MSYS系统构建。


清洁解决方案:

  • 安装适用于Windows 2的 Git-它是由正确维护的新MSYS2构建而成 ,还具有许多新功能,大量错误修复,安全性改进等。 如果可能的话,也建议使用64位版本 但是对于32位系统,在后台自动执行了变基解决方法 ,因此在那里发生问题的机会也应该更低。
  • 只需重新启动计算机以清理地址空间(将这些模块加载到其他随机地址)可能会起作用,但实际上,只需升级到Windows 2的Git即可获得安全修复程序。

hacky解决方案:

  • 更改PATH有时可以起作用,因为在不同版本的Git或其他基于MSYS的应用程序中可能存在不同版本的msys-1.0.dll ,它们可能使用不同的地址,此堆的不同大小等。
  • 重新设置msys-1.0.dll可能会浪费时间,因为1)作为DLL,它已经具有重定位信息,以及2)“在任何版本的Windows OS中,无法保证将始终加载(…)DLL在相同的地址空间”( 来源 )。 唯一有帮助的方法是,如果msys-1.0.dll本身加载在要使用的冲突地址上。 显然有时候是这样,因为Windows的Git正是在32位系统上自动执行的操作
  • 考虑到以上情况,我本来二进制修补的结果msys-1.0.dll二进制来使用不同的值_cygheap_start并立即解决的问题。

方案4:

变基解决方案的非常简单的验证:

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

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

通过按住shift键并右键单击该文件夹,您应该可以从此处以管理员身份打开命令提示符(感谢https://stackoverflow.com/users/35538​​9/darren-lewis的评论),

然后运行:

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

当重启方法不起作用时,这为我修复了该问题。

希望能帮助到你。

方案5:

升级到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会话。
在该DOS会话中更新%PATH% ,git命令就可以使用了。


请注意, carmbresterSixto Saez均在下面的报告中(在评论中)必须重新启动才能解决此问题。
注意:首先,还要删除所有msys-1.0.dll ,例如%LOCALAPPDATA%一个。

方案6:

如果重新启动不能解决问题(如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安装。)

方案7:

只想在这里分享我的经验。 在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文件,它解决了该问题。

方案8:

我今天遇到了这个。 在格雷格·休吉尔(Greg Hewgill)的回答的带领下,我查看了系统上正在运行的进程,以查看是否有任何东西“卡住”,或者其他用户是否已使用git登录到计算机中。 然后,我在这台特定的计算机上启动了cygwin(单独安装)。 它启动确定。 我关闭了它,然后再次尝试了Git扩展(我正在尝试拉操作),并且它起作用了。 不知道cygwin的启动是否清除了共享的东西,但这是我第一次遇到此错误,这似乎为我解决了。

方案9:

在Windows 8.0崩溃和更新后,在msys git 1.9上,我遇到了同样的问题。 我在路径中没有找到任何msys / git,因此我将其添加到Windows本地用户环境设置中。 它没有重新启动就可以工作。

基本上,它类似于RobertB,但是我的路径中没有 git / msys。

顺便说一句:

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

  2. 如果您需要快速并且没有时间调试,我会注意到Git目录中的“ Git Bash.vbs”成功启动了bash shell。

方案10:

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

方案11:

如果您在PATH中有C:\\ MinGW \\ bin,则我在LPCEXpresso building中遇到了此问题。 我不得不删除它以摆脱这个问题,因为其他一些MinGW也基于

方案12:

要解决此问题,我只需让Tortoise Git安装其更新即可。

方案13:

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

方案14:

删除旧版本的%USERPROFILE%\\ AppData \\ Local \\ SourceTree \\ app-xxx对我有用。 不确定如何将其连接到命令行git …

参考连接:

https://stackoverflow.com/questions/18502999/18502999