检测到 Cygwin/Git 错误 cygheap 基本错误匹配

我已经用 cygwin 和 git 的最新版本安装了两个 windows 服务器,并且正在尝试将 git 存储库从 S1克隆到 S2。我可以使用 RSA 键成功地从 S2到 S1执行 ssh,但是当我这样做时: Git 克隆“ ssh://root@S1/path/to/my/repo” 它返回这个输出:

    Cloning into /cygdrive/c/program files/apache software foundation/apache2.2/htdocs/myfolder...
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 fro cygwin1.dll using the WIndows Start->Find/Search facility and delete all bu 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 distrubtion. 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 oobjects: 100% (3106/3106), done.
fatal: write error: Broken pipe

所以我按照说明做了,但是没有结果,有什么建议吗?

69576 次浏览

是否使用其他命令得到这个错误? 使用 git --version

尝试重新运行 Cygwin setup.exe并重新安装您的 cygwin1.dll(软件包是“ Cygwin”,在“ Base”下)和您的 git 软件包(软件包“ git”在“ Devel”下)并重新启动。

您在问题陈述中没有提到这一点,但我假设您运行的是64位版本的 Windows。Cygwin 在64位 Windows 上运行有问题,尤其是大型程序。我认为这是由于 cygwin1.dll 支持库中的内存管理问题造成的。它似乎在做一个不可支持的假设,即它将永远并且总是在每个进程中映射到相同的地址,因此它可以在系统范围的全局变量中保留特定于进程的内容(比如堆地址)。

在我充裕的空闲时间里,我一直在努力寻找那些有问题的地方。与此同时,您可以尝试将 cygwin1.dll 本身重新定基。要注意的是,这是一个很大的打击,比它需要的复杂得多-甚至比重建所有其他东西的基础更复杂。

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

DR: 转到 GitHub AppData文件夹并删除 PortableGit文件夹,然后重新启动 GitHub

  1. 关闭 GitHub
  2. 导航到 GitHub AppData 文件夹: C:\Users\[username]\AppData\Local\GitHub
  3. 删除以 PortableGit开始并以随机字母和数字字符串结束的文件夹
  4. 重新启动 GitHub。它将重新提取 dll,问题应该被解决了!

(原答案) 我尝试了很多方法,但是我不知道到底是什么起了作用。我重新启动了 GitHub,重新启动了我的电脑,卸载并重新安装了 GitHub,卸载了其他几个我最近安装但最终不需要的程序,删除了 AppData Local 目录下的 GitHub 文件夹,下载并安装了 cygwin,可能还有其他一些我忘记的东西。

最后一次尝试是在 File Explorer 中查找所有 cygwin1.dll 文件,并将它们重命名为 cygwin1x.dll,然后重新启动计算机。在我这么做之后,它又起作用了。

我冒险在这里猜测,但我要说,下载和安装 Cygwin然后 重启我的电脑做了这个技巧。

我也有同样的问题。

我只是 重新开始我的电脑,它再次工作。

找出问题的原因无济于事,但至少你可以继续工作。

对我来说,原因是 git 没有通过 cygwin 安装,尽管通常是从 git-scm 下载的。一旦我运行了 cygwin 设置,添加了 git,它就完美地工作了。

对我来说,问题是存在一个较旧的 C: cygwin64文件夹。重命名此文件夹是不够的。当我删除这个文件夹时,问题就消失了。删除 C: cygwin64文件夹后,我也不需要重新启动。

我知道这是一个老主题,但是因为它是这个问题的第一个结果,我想加上我的决心,希望它能帮助其他人。

首先,运行 cygcheck PROGRAMM,在我的例子中,我遇到了 tar.exe的问题,所以我运行: cygcheck tarcygcheck命令显示使用了什么 DLL。

cygcheck中看起来一切正常,所以我决定,根据吉姆施耐德的意见,从64位版本的 Cygwin 切换到32位版本,这最终解决了我的问题。

在我的情况下,重新启动计算机不工作。

我最后发现,这是由于 Msys 安装之间的冲突(在安装命令行 git 实用程序时安装的)。如果您的系统路径包含任何具有 Msys 版本的目录,请删除这些路径条目,然后再试一次。看起来 cygwin 试图从 Msys 安装中执行可执行文件,而。Dll 检测到不匹配。

Cygwin/git 可能受到 ASLR 的影响

在我的案例中,一个名为 位址空间配置随机载入(ASLR)的 Windows 安全特性造成了这个问题。ASLR 默认情况下应该是关闭的程序,不标记自己兼容(更多的 信息)。
我还没有检查 cygwin/git 二进制文件的头部是否有这个标志,但是 我确实为所有应用程序手动启用了 ASLR作为额外的安全措施。事实证明,这使得 git 命令停止工作。< br >

解决方案

解决方案是为 git 可执行文件排除 ASLR。由于它们的数量很多,我不得不使用 PowerShell 作为 管理人:

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

在我的例子中,环境变数中的 PATH 是错误的。我在路径中稍早移动了 cygwin (确保它在 git path 之前设置)。这样 Cygwin 就支持 Git dll 了。

例如,C:\Program Files\Git\usr\bin;C:\cygwin\bin;...的路径 改成了 C:\cygwin\bin;C:\Program Filenter code herees\Git\usr\bin;...

环境是 Win7x86,需要重新启动该更新的路径。

当我试图使用以 # 开头的脚本从 Visual Studio 2017推到一个 git repo 时,我也犯了同样的错误![垃圾桶]

[repo folder]\.git\hooks\commit-msg

错误信息:

1 [main] sh (11460) c:\program files (x86)\microsoft visual studio\2017\enterprise\common7\ide\commonextensions\microsoft\teamfoundation\team explorer\Git\usr\bin\sh.exe:
*** fatal error - cygheap base mismatch detected - 0x14DD408/0x12AD408.This problem is probably due to using incompatible versions of the cygwin DLL.
Search for cygwin1.dll using the Windows Start->Find/Search facilityand 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 haveinstalled the cygwin distribution.
Rebooting is also suggested if youare unable to find another cygwin DLL.

我尝试了以上不同的解决方案,但没有成功

为了解决这个问题,我所做的就是复制以下内容:

C:\Program Files\Git\usr\bin

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\usr\bin

我电脑上的问题来自于 sh.exe 上的版本不匹配,复制这些文件解决了这个问题

我解决这个问题的方法是暂时关闭 Windows Defender,然后再试一次ーー详情请参阅 https://superuser.com/a/1047031/158243

在文本墙下面的解决方案(对我来说不起作用但也许可以帮助别人的东西?)

升级后的 Ruby + Devkit (MSYS2工具链)从2.6.2-1 I 升级到2.6.6-2 得到了巨大的错误,无法继续工作。我试过了 这里提到的所有东西。可能在这个问题上花了6个多小时。 什么都没用,我准备好重装 Windows 了。

  • 我已经重启了几十次了。
  • 我把 Cygwin 完全删除了,系统上没有 cygwin1.dll
  • 我重新安装了 Git、 GithubDesktop、 Ruby,并对 MSYS2做了很多修改。唯一的结果是学习 MSYS 可以完全 取代 Cygwin-使 Cygwin 变得不必要。
  • 对于 Settings-> Update & Security-> Windows Security-> App & browser control-> Exploit protection settings-> System settings,我将下面的设置设置为“默认关闭”
    • 强制性 ASLR (未编译/DYNAMICBASE 的图像的部队重新定位)
    • 自底向上的 ASLR (为虚拟内存分配随机化位置)
    • 高熵 ASLR
  • 作为我的计算机唯一的所有者和用户与 Powershell ISE 作为管理员运行,Windows 有胆量告诉我 Requested registry access is not allowed如果我尝试运行 Get-ProcessMitigation或 所以这是个死胡同。
  • 我尝试用(224MB 的 DLL)重新定位所有 msys64dll
    cd C:\msys64 && \usr\bin\dash /usr/bin/rebaseall -p -v
    • 在我的32GB 内存、64GB VirtualMem 的机器上,它告诉我:
      rebase: Too many DLLs for available address space: Cannot allocate memory
  • 我花了很多时间调整环境变量 System PathUser Path和重新启动。
    • 我了解到经常重复的“用户 EnvVars 覆盖系统 EnvVars”在涉及到 Path 变量时是不正确的。系统路径优先,因为用户路径被追加到系统路径以使 $PATH变量。
      出于这个原因,下一个项目对某些人来说是一个修复,特别是在 bash 启动失败的情况下
    • 如果您已经安装了 WSL2(用于 Linux 的 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;应该首先列出 成为新的第一个入口。
  • 在开始检查 $Path 操作和它们可能加载的任何东西时,回顾了所有的文件 bash 加载
    • %USERPROFILE%有: \.bashrc\.gitconfig\.bash_profile\.profile
    • C:\Program Files\Git\etc有: \profile.d\profile.d\bash_profile.sh\profile.d\env.sh\bash.bashrc,和 \profile
    • C:\Program Files\Git\usr\etc中还有更多类似的内容

解决方案

错误消息错误地引用 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)”上的分支的附加文本
    • 同样,如果您决定删除所有额外的 dlls 并将 C:\msys64\usr\bin添加到您的路径中,那么它必须查找相对于它通常所在的目录的依赖项。
  • 为了识别 cygheap问题,我使用 < a href = “ https://Learn.microsoft.com/en-us/sysinterals/downloads/listdlls”rel = “ nofollow norefrer”> https://learn.microsoft.com/en-us/sysinternals/downloads/listdlls 检查了运行时引用的 dll
    • 为每个步骤在单独的窗口中启动一个新的 cmd.exe。必须使用精确的路径,以确保正确的东西加载。
      1. MSYS (cmd.exe 窗口 # 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,那么以下操作将会失败
          • - > cygheap err
          • - > cygheap err
      2. Cygwin (cmd.exe 窗口 # 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,那么以下操作将会失败
          • - > cygheap err
          • - > cygheap err
      3. Git Bash (cmd.exe 窗口 # 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,那么以下操作将会失败
          • - > cygheap err
          • - > cygheap err
      4. Win Bash (cmd.exe 窗口 # 4)
        • "C:\Windows\System32\bash.exe"重复该过程。
        • 在我的机器上,它甚至无声无息地启动不了。这也是我必须在 System32之前在系统路径中加载 GitBash 的原因之一
    • 打开这些控制台后,检查引用的 dls
      • 运行 < a href = “ https://Learn.microsoft.com/en-us/sysinterals/downloads/listdlls”rel = “ nofollow norefrer”> listdlls -r bash
        • 检查输出是否有不同于其他 dls 的内容,然后将其单独列出
          (在这种情况下 msys-2.0.dll)
      • 运行 listdlls -r -v -d msys-2.0.dll
      • 检查基地,路径和版本信息的差异。
    • 选择一个你想在任何地方使用(Git-Bash 版本最好的 IMO)和删除其他。

背景

我的所有旧版本的 Visual Studio (2017和2019)都运行良好,但是新安装的 Visual Studio 2022在我的 Windows 10计算机中遇到了 Git 问题。

不起作用的解决方案

  • 重新启动 Windows。
  • 通过官方安装程序重新安装 Git。
  • 重新安装/更新 Cygwin64。
  • 在我系统的 Windows Defender 安全中心禁用图像的强制随机化(强制 ASLR)。
  • 不包括针对 git 可执行文件的 ASLR。
  • 查找和删除 cygwin1.dll的新版本。

实际解决方案

  1. 查找所有的 msys-2.0.dll(下面的方法递归查找文件比文件资源管理器更快,谢谢) :
dir \msys-2.0.dll /s

注意 : 正如其他人指出的那样,Git for Windows实际上使用的是 MSYS而不是 Cygwin。MSYS 团队在导入和修改 Cygwin 源代码(来源)时忘记更改错误消息。因此,要搜索和删除的实际文件是 msys-2.0.dll,而不是 cygwin1.dll

  1. 删除与您遇到麻烦的 VisualStudio 版本相关的此文件的出现次数。例如,如果只使用 VisualStudio2022时遇到麻烦,那么只需从以 C:\Program Files\Microsoft Visual Studio\2022\C:\Program Files (x86)\Microsoft Visual Studio\2022\开始的路径中删除 msys-2.0.dll
  2. 删除文件夹 C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git
  3. 打开 Visual Studio 安装程序——你可能已经在你的电脑上安装了它,因为你有 Visual Studio,否则,下载它——点击你遇到麻烦的 Visual Studio 版本 修改,点击 个别组件,然后选择 代码工具下的 Git for Windows选项。

注意 : 如果您已经在计算机中安装了 Git,这并不重要; 您仍然需要执行这个步骤。

  1. 重启你的电脑。
  2. 成交。

我希望这能帮到你,就像它帮到我一样。

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

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