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

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 sourceで確認できます。


アドレス空間のその部分が空いていないのはなぜですか?

多くの理由が考えられます。私の場合、競合するアドレスにロードされた他のモジュールがいくつかありました。

プロセス エクスプローラーのプロセス モジュール

最後のアドレスは約 0x68570000 + 5 MB = 0x68C50000 になりますが、これらの WOW64 関連の DLL が 0x68810000 から上にロードされ、割り当てがブロックされます。

共有 DLL がある場合、Windows は通常、すべてのプロセスで同じ仮想アドレスに DLL をロードして、再配置処理を節約しようとします。今回、これらのシステム コンポーネントが何らかの理由で競合するアドレスにロードされたのは、運が悪いだけです。


Git に Cygwin があるのはなぜですか?

Git は、いくつかの低レベルのコマンドと多くの便利なユーティリティで構成されるリッチ スイートであり、ほとんどが Unix ライクなシステムで開発されているためです。大規模な書き換えを行わずにビルドして実行できるようにするには、少なくとも部分的に Unix に似た環境が必要です。

それを達成するために、人々は MinGW と MSYS を発明しました。これは、Unix のような方法で Windows 上でプログラムを開発するための最小限のビルド ツール セットです。MSYS には共有ライブラリ this も含まれており、msys-1.0.dll実行時の 2 つのプラットフォーム間の互換性の問題を解決するのに役立ちます。そして、その多くの部分は Cygwin から取られたものです。なぜなら、誰かが既に同じ問題を解決しなければならなかったからです。

したがって、Cygwin ではなく、ここで奇妙な動作をしているのは MinGW のランタイム DLL です。

Cygwin では、このコードは実際には MSYS 1.0 の内容から大幅に変更されています。そのファイルの最後のコミット メッセージには、2001 年からの「Import Cygwin 1.3.4」と書かれています。

現在の CygwinMSYS の新しいバージョンであるMSYS2 の両方には、既に別のロジックが実装されており、より堅牢であることが期待されます。古い壊れた MSYS システムを使用してまだビルドされているのは、Git for Windows の古いバージョンのみです。


クリーン ソリューション:

  • Git for Windows 2をインストールします。適切にメンテナンスされた新しいMSYS2で構築されており、多くの新機能、多数のバグ修正、セキュリティの改善なども含まれています。可能であれば、64 ビット版を使用することもお勧めします。ただし、リベースの回避策は 32 ビット システムのバックグラウンドで自動的に実行されるため、そこで問題が発生する可能性も低くなります。
  • コンピューターを再起動してアドレス空間をきれいにする (これらのモジュールを別のランダムなアドレスにロードする) だけでうまくいくかもしれませんが、実際には Git for Windows 2 にアップグレードしてセキュリティ修正を取得するだけです。

ハッキーなソリューション:

  • 異なるバージョンの Git または他の MSYS ベースのアプリケーションに異なるバージョンがあり、おそらく異なるアドレス、異なるサイズのこのヒープなどを使用するPATH可能性があるため、変更が機能する場合があります。msys-1.0.dll
  • msys-1.0.dll1) DLL であるため、既に再配置情報があり、2) 「Windows OS のどのバージョンでも、(...) 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

C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\私の で Git パスを先頭にする%PATH%と、エラー メッセージが表示されなくなりました。

再起動する必要はなく、DOS セッションを変更する必要さえありません。
その%PATH%DOS セッションで が更新されると、git コマンドが機能します。


carmbresterSixto Saezの両方が、問題を解決するために再起動する必要があることを以下 (コメント内) で報告していることに注意してください。注:最初に、のようなもの
も削除しますmsys-1.0.dll%LOCALAPPDATA%

于 2014-01-03T16:10:20.213 に答える
1

私は今日これに遭遇しました。Greg Hewgill の回答に導かれ、自分のシステムで実行中のプロセスを調べて、何か「スタック」していないか、他のユーザーがマシンにログインして git で何かを行っていないかを確認しました。次に、この特定のマシンで cygwin (個別にインストール) を起動しました。無事起動しました。私はそれを閉じてから、Git Extensions を再試行しました (私はプル操作を試みていました)。cygwin の起動によって共有されたものがクリアされたかどうかはわかりませんが、このエラーに遭遇したのはこれが初めてで、これで修正されたようです。

于 2014-07-08T17:28:07.400 に答える
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 シェルを正常に起動していることに気付きました。

于 2014-11-19T11:52:38.290 に答える
0

PATH に C:\MinGW\bin がある場合、LPCEXpresso のビルドでこの問題が発生しました。他の MinGW のようなベースもあったため、この問題を解決するために削除する必要がありました。

于 2014-06-20T06:36:47.507 に答える