git-cmd.exeのソースコードgit-wrapper.c を読んだ
Git for Windowsでは、コンソールプロセスで実行した対話型コマンド実行環境のpowershell.exeやcmd.exeやbash.exeから、キャラクターモードアプリケーションとしてgit.exeを実行する。
コンソールプロセスやキャラクターモードアプリケーションについてはMicrosoft Documentation(昔のMSDN?)に書かれてる。
そのために用意されているのが、同じgit-wrapper.cをコンパイル、リンクしたgit-cmd.exeやgit-bash.exeだった(cmd/git.exeもそうだとは知らなかった)。
Makefile
名前を頼りにリポジトリを眺めていると見つかる。
mingw-w64-git/mingw-w64-git.mak#L21-L25
git-bash.exe git-cmd.exe compat-bash.exe \ cmd/git.exe cmd/gitk.exe cmd/git-gui.exe: \ %.exe: git-wrapper.o git.res @mkdir -p cmd $(QUIET_LINK)$(CC) $(ALL_LDFLAGS) $(COMPAT_CFLAGS) -o $@ $^ -lshlwapi
git-wrapper.c
順番に読んでいるだけで、実際の使われ方と対応付けることはしてない。
- エントリポイントはL950のwmain
- 実体はL713のmain
- プロセスの実行ファイルの完全パスを突き止めたりしている
- 最初にリンクしたリソースファイルの内容から実行されているプロセスを区別している
- git-cmd.exeの引数
--no-cd
などはこの辺でチェックされている - 引数に
--command
を見つけたらその後ろはチェックしないようになっている - git-lfs.exeやscalar.exeとして実行されることもあるようになっている
- git.exeで実行されているときはここに入る
mingw64/bin/git.exe
が存在しないときはbin/git.exe
を使うようだ- 環境変数を整えてから最終的に実行するコマンド文字列を組み立てている
- git-cmd.exeで実行されているときはカレントディレクトリに置かれたgit.exeを実行してしまわないように工夫している
- doskeyのマクロとして設定されている?よくわからないな
- この辺でコマンドを実行する
- https://github.com/git-for-windows/MINGW-packages/blob/main/mingw-w64-git/git-wrapper.c#L912-L922
- CreateProcessはCマクロでCreateProcessAのユニコード版CreateProcessWになる
- 返り値はboolean
- プロセスの起動が成功したら
SIGINT
で停止できるようにしてからWaitForSingleObject
で完了を待つ