git-submodule is borken?

Windowsでcmakeとmake、gitを併用した時にハマった問題。

chocolateyでmsys2とmakeをインストール。

その後MinGW64のターミナルでpacmanでcmakeとgitをインストール。

ここまでは良いのだけど、一部のgitコマンドを使う時に以下のようなエラーメッセージが表示されました。

‘git submodule update –init ‘ returns fatal: ‘submodule’ appears to be a git command, but we were not able to execute it. Maybe git-submodule is broken?

これはsubmoduleコマンドの例だけど、他のコマンドでも表示されるようす。でもgit statusなどは大丈夫。

これ実はgitの一部のサブコマンドはシェルスクリプトで実装されていて、それがシェルとしてshを使用しているのにMinGW環境にshがインストールされていない事から表示されるようです。

シェルスクリプトの実態は/usr/lib/git-core/git-***として存在します。リストを見ると分かる通り、ほとんどのコマンドは*.exe形式なのに、git-submoduleやgit-stashなどはシェルスクリプトで実装されています。

そしてシェルスクリプトの中を見ると一行目に以下のコマンドが。

!/bin/sh

そしてMinG64のターミナルで “which sh” とすると、どこにも見つからないよと言われます。

よっしゃよっしゃ、sh.exeをインストールすればええんやな~とpacmanでsh.exeをインストールするとgitは動くようになるけど、今度はcmakeが以下のエラーを。

CMake Error at C:/tools/msys64/mingw64/share/cmake-3.8/Modules/CMakeMinGWFindMake.cmake:12 (message):
sh.exe was found in your PATH, here:

C:/tools/msys64/usr/bin/sh.exe

For MinGW make to work correctly sh.exe must NOT be in your path.

Run cmake from a shell that does not have sh.exe in your PATH.

If you want to use a UNIX shell, then use MSYS Makefiles.

理由は書いてある通り、sh.exeへのパスが通っているとcmakeはエラーになるらしい。しかしgitのシェルスクリプトはshを必要とするわけで、そこで致し方なくgitのシェルスクリプトをbash.exeを参照するように書き換えて無事解決しました。

Author: kan
初めてプログラムらしきものを作ったのは幼稚園の時。それから約40年経ち、現在はデジタル回路設計から信号処理、機械学習まで幅広い経験を活かしてシステムアーキテクトとして活動中。超並列処理、デジタル回路とソフトウェアのバランス設計が得意分野。 Linux/Mac/Windows使い。 C/C++を主要言語として、Unity、Qtなどのフレームワーク興味あり。UI/UXデザイン、STL拡張など。 音声処理、画像処理、技術コンサルは仕事でも請け負います。 一般ソフトウェア開発プロセス、医療機器ソフトウェア開発プロセス作成も進行中。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください