Cygwin/Git 错误:检测到 cygheap 基址不匹配

75

我已经安装了两个最新版本的Cygwin和Git的Windows服务器,
现在我想从S1克隆git存储库到S2。
我可以使用RSA密钥从S2成功地进行ssh到S1,但是当我尝试这样做时:

git clone "ssh://root@S1/path/to/my/repo"

它会抛出以下输出:

Cloning into /cygdrive/c/program files/apache software foundation/apache2.2/…
      2 [main] git 2004 C:/cygwin/lib/git-core/git.exe *** fatal error
 - cygheap base mismatch detected - 0x61242860/0x6123790.
This problem is probably due to using incompatible versions of the cygwin DLL.
Search for cygwin1.dll using the Windows Start->Find/Search facility
and delete all but the most recent version.  The most recent version *should*
reside in x:\cygwin\bin, where 'x' is the drive on which you have
installed the cygwin distribution.  Rebooting is also suggested if you
are unable to find another cygwin DLL.

--5 more errors like that one --

remote: Counting objects: 3275, done.
remote: Compressing objects: 100% (3106/3106), done.
    fatal: write error: Broken pipe

我遵循了建议的步骤,但没有成功。 有什么建议吗?


有些人可能会尝试ASLR:https://dev59.com/questions/82kw5IYBdhLWcg3w6ewb#76296598 - T.Todua
16个回答

69

我有同样的问题。

我只是重新启动了我的电脑,它又正常工作了。

这并不能帮助找到问题的原因,但至少你可以继续工作。


20
起初我嘲笑了这个回复,然后放弃了并完成了它。现在我又重新开始运行了。所以现在我将为它点赞。 - Scott Smith
1
@Waylan 尽管看起来不像是一个好的答案,但我刚刚遇到了相同的问题,重启了电脑,问题得以解决。 - Pico Riley
6
有时候,最简单的事情是最有效的...因此有一句座右铭:“当你犯迷糊时,重启!” - Saborknight
1
我尝试了下面的ASLR解决方案,但没有帮助。重新启动确实有帮助。 - RuudSieb
1
说实话,我也对这个解决方案持怀疑态度,但是到了2021年,它仍然成立。 - isaacsan 123
抱歉,Windows 10 + LaTeX Asymptote + Git Bash(在2021年至今)摧毁了这个解决方案。100次重启后成功率为0%(真的)。 - MATHS MOD

64

cygwin/git 可能受到ASLR的影响

在我的情况下,Windows的一个安全特性叫做地址空间布局随机化(ASLR)引起了这个问题。对于不标记自己兼容的程序,默认情况下应该关闭ASLR(更多信息请参见此处)。
我没有检查cygwin/git二进制文件是否在它们的头文件中有这个标志,但是我已经手动为所有应用程序启用了ASLR作为额外的安全措施。结果证明,这使git命令停止工作。

解决方案

解决方案是排除git可执行文件的ASLR。 因为它们很多,我必须使用PowerShell作为管理员

Get-Item -Path "C:\Program Files\Git\usr\bin\*.exe" | %{ Set-ProcessMitigation -Name $_.Name -Disable ForceRelocateImages }

3
我非常需要感谢你。这让我疯了。整个MSYS分发包被ASLR卡住了。Get-Item -Path "C:\msys64\usr\bin\*.exe" | %{ Set-ProcessMitigation -Name $_.Name -Disable ForceRelocateImages }解决了这个问题。 - ZJR
4
甚至更好:Get-ChildItem -Path C:\msys64 -Recurse -Include *exe | %{ Set-ProcessMitigation -Name $_.Name -Disable ForceRelocateImages }该命令的作用是递归地查找路径为C:\msys64下所有exe文件,并禁用它们的ForceRelocateImages进程缓解功能。 - ZJR
4
@ZJR Set-ProcessMitigation:该术语不被识别为命令、函数、脚本文件或可操作程序的名称。请检查拼写,或者如果包括路径,请验证路径是否正确,然后重试。 - Prostak
谢谢!一个修复问题的脚本 - 很好。手动处理太多了。 - Julian Knight
它在2022年和Windows 11中仍然有效。我在anaconda3的“cut.exe”上遇到了同样的问题。 - Luis Lizcano

24

编辑:我找到解决方法了。

TL;DR:进入GitHub AppData文件夹,删除PortableGit文件夹,然后重新启动GitHub。

  1. 关闭GitHub。
  2. 找到GitHub AppData文件夹: C:\Users\[用户名]\AppData\Local\GitHub
  3. 删除以PortableGit开头,并以随机字母数字结尾的文件夹。
  4. 重新启动GitHub。它将重新提取dll文件,问题应该会得到解决!

(原始“回答”)我尝试了很多方法,最终不知道哪一个有效了。我重新启动了GitHub,重新启动了电脑,卸载和重新安装了GitHub,卸载了几个我最近安装但最终没有用的程序,删除了AppData\Local目录中的GitHub文件夹,下载并安装了cygwin,可能还有其他我忘记的东西。

最后一次尝试是在文件资源管理器中找到所有的cygwin1.dll文件,并将它们重命名为cygwin1x.dll,然后重新启动计算机。这样做之后,它又可以工作了。

我在猜测,但我想说下载并安装cygwin,然后重新启动计算机可能是解决问题的关键。


2
很遗憾对我没用。我使用的是64位的Windows 10操作系统。 - Heather
8
可能需要重新启动Windows。我也是使用64位的Windows 10操作系统。 - shieldgenerator7
按照这些说明在 W10 x64 上对我有效。 - Dale
重启后对我有效,w10 x64。 - Barış Uşaklı
1
只是为了明确起见,关闭GitHub,删除“PortableGit”文件夹,重新启动计算机,重新启动GitHub。在此之前,我不得不尝试几次才成功。 - friek108
显示剩余2条评论

11

对我来说,问题在于没有通过cygwin安装git,而是从git-scm进行的常规下载。一旦我运行了cygwin安装程序并添加了git,它就完美地工作了。


4
我曾经遇到和您一样的问题。从git-scm卸载Git,然后在Cygwin内安装Git可以解决这个问题。 - arimbun
1
我不认为从git-scm卸载git是必要的。 - Geoff Lentsch
我正在使用Jenkins。我没有自由选择我的Git。我只能安装Jenkins想要的那个。 - mercury

10

在你的问题陈述中没有提到,但我假设你正在运行64位版本的Windows。Cygwin在64位Windows上运行时存在问题,特别是在处理大型程序时。我认为这是由于cygwin1.dll支持库内存管理问题所致。看起来它正在做不可支持的假设,在每个进程中它将永远被映射到相同的地址,因此它可以将进程特定的事物(如堆地址)保存在系统范围的全局变量中。

在我的空闲时间里,我一直在尝试找出问题出在哪里。与此同时,您可以尝试重新定位cygwin1.dll本身。请注意,这比需要重新定位所有其他内容要复杂得多。


1
根据http://cygwin.com/ml/cygwin/2006-11/msg00580.html,这很可能是由于在STARTUPINFO结构中使用了保留字段。由于STARTUPINFO结构以其长度开头,因此只需使用一个比预期更大的结构来保存当前在此保留字段中的数据即可。我会尝试并再次评论我的结果。 - Jim Schneider
1
抱歉让你等这么久才回复。我需要做一个假设 - 在这种情况下,服务器是Windows 7,64位。通过运行时检查解决了64位Vista的问题,并在该平台上绕过了它。然而,在Windows 7上仍存在问题,但是解决方法检查版本相等,而不是大于或等于。我会立即用补丁再次发表评论。您将需要cygwin1.dll源代码和编译器套件来自行构建它。您可能还需要之后运行rebaseall。 - Jim Schneider
1
在cygwin-${VERSION}/winsup/cygwin的wincap.cc文件中,有一个名为wincap7的结构体(在源代码1.5.17版本中从第271行开始)。您需要将needs_count_in_si_lpres2字段从“false”更改为“true”。该字段是为了解决Windows Vista 64位中仍存在于Windows 7 64位中的一个错误而设置的。 - Jim Schneider
我认为我在MSYS2 64位的Windows 10下遇到了这个问题。根据https://github.com/Alexpux/Cygwin/blob/4de8754bac676fc/winsup/cygwin/wincap.cc#L78中的内容,wincap10中的字段为“false”。可执行文件大小为140MB。您知道您提出的修复是否仍然必要吗? - letmaik
如果在 Windows 10 的漏洞利用保护中打开了强制 ASLR,这也会发生;默认情况下应该关闭它。 - Nathan Castle

7

您是否在运行其他命令时遇到此错误?例如使用 git --version 命令?

请尝试重新运行Cygwin的 setup.exe ,并重新安装您的 cygwin1.dll 文件(该文件包含在“基础”选项中名为“cygwin”的软件包中),以及您的 git 软件包(该软件包位于“开发”选项中名为“git”的软件包下),之后重启电脑。


git status和git --version都能正常工作。此外,我可以通过cygwin ssh到服务器。看起来cygwin版本的git存在问题,这与我直接安装在操作系统上的版本不同。我不太愿意尝试重新运行设置,因为第一次安装所有文件花费了我大约一个小时/一个半小时的时间。除非您建议有一种方法只安装我需要的部分? - John Zumbrum
是的,Cygwin的setup.exe GUI允许您选择安装、卸载或更新少量软件包。 - Keith Thompson
在开发计算机上尝试过了,没有任何区别。在生产服务器上操作了一下,但是需要重新启动,所以至少要等到明天早上才能知道结果。 - John Zumbrum
1
使用谷歌搜索“cygheap base mismatch detected”(带引号)会得到很多结果。我没有跟进这些链接,但你可能想要查看一下。 - Keith Thompson

4
以下是文字墙下的解决方案(这些对我没有用,但可能对其他人有帮助?)
在将Ruby + Devkit(MSYS2工具链)从2.6.2-1更新到2.6.6-2后,我遇到了cygheap错误,无法继续工作。我尝试了这里提到的一切。可能花了6个小时以上解决问题。没有任何作用。我准备重新安装Windows。
  • 在整个过程中,我重启了数十次。
  • 我完全删除了Cygwin,系统上没有cygwin1.dll
  • 我重新安装了Git、GithubDesktop、Ruby,并对MSYS2进行了大量操作。唯一的结果是学习到MSYS可以完全替代Cygwin,使Cygwin变得不必要。
  • 对于设置->更新和安全性->Windows安全性->应用程序和浏览器控制->利用保护设置->系统设置,我将以下设置为“默认关闭”
    • 强制ASLR(强制重定位未使用/DYNAMICBASE编译的映像)
    • 自下而上的ASLR(随机化虚拟内存分配的位置)
    • 高熵ASLR
  • 作为计算机的唯一所有者和用户,使用管理员权限运行Powershell ISE,如果我尝试运行Get-ProcessMitigationSet-ProcessMitigation,Windows会告诉我请求的注册表访问不允许。所以这是个死路。
  • 我尝试使用(224MB的DLL)重新定位所有msys64 dlls
    cd C:\msys64 && \usr\bin\dash /usr/bin/rebaseall -p -v
    • 在我的32GB RAM机器上,有64GB的虚拟内存,它告诉我:
      rebase:可用地址空间太多DLL:无法分配内存
  • 我花了很多时间调整环境变量系统路径用户路径并重新启动。
    • 我了解到经常重复的“用户EnvVars优先于系统EnvVars”在Path变量中不是真的。系统路径优先,因为用户路径附加到系统路径以创建$PATH变量。
      因此,下一个项目是一些人的修复措施,特别是如果bash无法启动
    • 如果您安装了WSL2(Windows子系统),则很可能正在使用C:\Windows\System32\bash.exe而不是C:\Program Files\Git\usr\bin\bash.exe
      Win Bash不与MSYS、Cygwin或Git-SCM兼容。
      • 确保C:\Program Files\Git\bin;在系统路径环境变量中位于C:\Windows\system32;之前。由于system32通常排在第一位,因此C:\Program Files\Git\bin;应该是新的第一个条目。
  • 检查bash在启动时加载的所有文件,检查$Path操作和它们可能加载的任何内容
    • %USERPROFILE%中有:\.bashrc\.gitconfig\.bash_profile\.profile
    • C:\Program Files\Git\etc中有:\profile.d

      解决方案

      错误信息错误地引用了cygwin1.dll作为问题所在。Git for Windows使用MSYS。MSYS开发人员将文件重命名为msys-2.0.dll,但未更新错误消息。

      • 查找计算机上所有的msys-2.0.dll文件,并在它们后面添加后缀.bkp
      • 在找到的任何位置,将"C:\Program Files\Git\usr\bin\msys-2.0.dll"复制到这些位置。 VoidTools Everything screenshot of msys-2.0.dlls

      注意事项和识别问题的步骤:

      • 如果您使用WSL2,请确保在系统路径环境变量中C:\Program Files\Git\bin;出现在C:\Windows\system32;之前。
        • System32应该是第一个系统路径,但是Windows bash.exe就在那个文件夹里——它与MSYS、Cygwin或Git-SCM不兼容。Git Bash必须在列表中更高才能选择Win Bash。
      • 如果您将C:\msys64\usr\bin\msys-2.0.dll复制到所有其他位置,则会失去显示您所在分支的漂亮附加文本"(master)"Shows what branch you're on
        • 如果您决定删除所有额外的dll,并只添加C:\msys64\usr\bin到您的路径中,则必须有相对于正常驻留目录的依赖项。
      • 为了确定cygheap问题,我使用 https://learn.microsoft.com/en-us/sysinternals/downloads/listdlls检查运行时引用的dll
        • 为每个步骤启动一个新的cmd.exe窗口。必须使用精确的路径以确保正确加载。
          1. MSYS (cmd.exe window #1)
            • 运行set PATH="C:\msys64\usr\bin;"
            • 运行"C:\msys64\usr\bin\bash.exe"
            • 确认/c/msys64/usr/bin/ls.exe"可以工作(应该是因为加载自己的msys-2.0.dll)
            • 如果它们引用不同的msys-2.0.dll,则以下操作将失败
              • "/c/Program Files/Git/usr/bin/ls.exe" -> cygheap err
              • "/c/cygwin64/bin/ls.exe"" -> cygheap err
          2. Cygwin (cmd.exe window #2)
            • 运行set PATH="C:\cygwin64\bin;"
            • 运行"C:\cygwin64\bin\bash.exe"
              Cygwin混淆路径。检查echo $path是否正确。
              如果不是,请运行Path="/cygdrive/c/cygwin64/bin"
            • 确认"/cygdrive/c/cygwin64/usr/bin/ls.exe"可以工作
            • 如果它们引用不同的msys-2.0.dll,则以下操作将失败
              • "/cygdrive/c/msys64/usr/bin/ls.exe" -> cygheap err
              • "/cygdrive/c/Program Files/Git/usr/bin/ls.exe" -> cygheap err
          3. Git Bash (cmd.exe window #3)
            • 运行set PATH="C:\Program Files\Git\usr\bin\;"
            • 运行"C:\Program Files\Git\usr\bin\bash.exe"
            • 确认"/c/Program Files/Git/usr/bin/ls.exe"可以工作
            • 如果它们引用不同的msys-2.0.dll,则以下操作将失败
              • "/c/msys64/usr/bin/ls.exe" -> cygheap err
              • "/c/cygwin64

我遇到了相同的cygheap基础不匹配错误,但只有在VS Code bash终端中运行make或任何任务时才会出现。我确信某种方式改变了cygwin bash,但实际上发现VSCode的terminal.integrated.shell.windows设置已从Cygwin的bash.exe更改为git-bash.exe。 - RichR
哇,这真是一项相当深入的研究。引用文本块的来源是什么? - Boaz
我写了这段代码。它被引用为一种将可以跳过的大段文字分组的方式,以便快速找到解决方案。此外,我应该在答案中补充说明,我遇到了几次类似的情况,比如在安装vs2022之后,现在我不再删除重复的文件,而是先删除它们,然后在其位置上创建符号链接来使用我想要的版本。 - Derek Ziemba

2
在我的情况下,环境变量中的 PATH 是错误的。我将 cygwin 在路径中稍微向前移动(确保它在 git 路径之前设置)。这样,cygwin dll 优先于 git dll。
例如; C:\Program Files\Git\usr\bin;C:\cygwin\bin;... 的路径已更改为 C:\cygwin\bin;C:\Program Files\Git\usr\bin;... 环境是 Win7x86,需要重新启动以使用更新后的路径。

2

对我来说,这似乎只是因为我的路径中有两个msys-2.0.dll文件。一个来自Git For Windows,另一个来自Msys2。

所以解决方案就是重命名:%APPDATA%\..\Local\Programs\Git\usr\bin\msys-2.0.dll(或者%PROGRAMFILES%\Git\usr\bin\msys-2.0.dll)为msys-2.0.bak(或者删除它)。


改名有帮助。 在我的情况下,它位于 C:\Program Files\Git\usr\bin - Pawel
哇,真是个好发现。 - T.Todua

1

我知道这是一个旧的帖子,但由于它是这个问题的第一个结果,我想添加我的解决方案,希望能帮助其他人。

首先运行cygcheck PROGRAMM,在我的情况下,我遇到了tar.exe的问题,所以我运行了:cygcheck tarcygcheck命令显示使用了哪些DLL。

cygcheck中一切看起来都正确,所以我决定根据Jim Schneider的评论,从64位版本的Cygwin切换到32位版本,最终解决了我的问题。


c:> cygcheck -c - posix99
这帮助我解决了问题 - 它显示了tar.exe的多个位置 - 删除了其中一个,它就开始工作了。 - rita

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