347

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工作正常。我不知道发生了什么。知道为什么会这样吗?

4

14 回答 14

382

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

在你 rebase 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。

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

于 2014-06-25T10:38:50.303 回答
235

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

于 2013-08-29T06:03:10.527 回答
140

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 源码


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

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

流程资源管理器中的流程模块

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

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


为什么你的 Git 中有 Cygwin?

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

为了实现这一点,人们发明了 MinGW 和 MSYS——一套最小的构建工具,用于在 Windows 上以类 Unix 的方式开发程序。MSYS 还包含一个共享库 this 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 变通方法是在幕后自动执行的,因此发生问题的可能性也应该更低。
  • 简单地重新启动计算机以清理地址空间(将这些模块加载到不同的随机地址)可能会起作用,但实际上,只需升级到 Windows 2 的 Git 以获取安全修复程序(如果没有其他问题)。

哈克解决方案:

  • 更改PATH有时会起作用,因为msys-1.0.dll在不同版本的 Git 或其他基于 MSYS 的应用程序中可能存在不同版本,它们可能使用不同的地址、不同大小的堆等。
  • 变基msys-1.0.dll可能会浪费时间,因为 1) 作为 DLL,它已经具有重定位信息,并且 2)“在任何版本的 Windows 操作系统中,都不能保证 (...) DLL 将始终加载到相同的地址空间”无论如何(来源)。这可以提供帮助的唯一方法是,如果它msys-1.0.dll本身加载到它然后尝试使用的冲突地址。显然有时会出现这种情况,因为这就是 Git for Windows 人员在32 位系统上自动执行的操作。
  • 考虑到上述发现,我最初对二进制文件进行了修补msys-1.0.dll以使用不同的值,_cygheap_start并立即解决了问题。
于 2015-08-12T16:26:03.417 回答
32

变基解决方案的非常简单的版本:

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

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

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

然后运行:

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

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

希望能帮助到你。

于 2016-01-08T11:31:54.960 回答
13

我在升级到 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

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

无需重新启动,甚至无需更改 DOS 会话。
一旦%PATH%在那个 DOS 会话中更新,git 命令就可以工作了。


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

于 2014-01-03T16:10:20.213 回答
8

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

于 2013-10-31T19:34:44.183 回答
2

只是想在这里分享我的经验。我在 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

尽管变基看起来很成功,但错误仍然存​​在。然后我rebase在 Cygwin64 终端中运行命令并得到一个错误:

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

后来我尝试了几个地址,但都没有工作。所以我最终更改了msys-1.0.dll文件,它解决了问题。

于 2018-03-07T15:03:04.700 回答
1

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

于 2015-03-27T19:48:40.880 回答
1

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

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

顺便提一句:

  1. 我尝试使用 rebase -b blablabla msys.dll,但出现错误“ReBaseImage (msys-1.0.dll) failed with last error = 6”

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

于 2014-11-19T11:52:38.290 回答
1

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

于 2014-07-08T17:28:07.400 回答
0

我在构建 LPCEXpresso 时遇到了这个问题。如果路径中有 C:\MinGW\bin。不知何故,我不得不删除它以摆脱这个问题,因为其他一些 MinGW 也像基于

于 2014-06-20T06:36:47.507 回答
0

为了解决这个问题,我只是让 Tortoise Git 安装它的更新。

于 2014-09-22T18:27:37.533 回答
0

删除旧版本的 %USERPROFILE%\AppData\Local\SourceTree\app-xxx 对我有用。不知道它是如何连接到命令行 git ...

于 2017-12-04T15:20:39.127 回答
0

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

于 2017-09-08T09:10:31.270 回答