WSLでWSLのGitとGit for Windowsをうまく使い分ける


要約

function g () {
  if [[ `pwd -P` == /mnt/* ]]; then
    git.exe "$@"
  else
    git "$@"
  fi
}

WSL めっちゃ便利

Windows Subsystem for Linux というものがあります。
Windows 上で Linux を動かすことのできるもので、/mnt/c/から Windows の C ドライブにアクセスすると Linux のコマンドでやりたい放題できるという、とても楽しく便利なものです。

が……

Git めっちゃ遅い

Git がなぜだかめちゃくちゃ遅い場合があります。
どのくらい遅いかと言えば、「うっかり Powerline のような Git の情報を見せてくれるリッチなプロンプトを使っていると、プロンプトを表示するだけで数十秒もの遅延が生まれるレベル」です。

なにゆえ……?

Windows ファイルシステムにある Git リポジトリの操作がめっちゃ遅い

↓ 先人

Q. それじゃあ Windows ファイルシステムにある Git リポジトリを扱いたい場合どうすれば……?

Windows ファイルシステムでは Git for Windows を使うようにする

A. 素直に Git for Windows 使いましょう。あとプロンプトの Git 情報表示機能は OFF にしましょう。

適当に~/.zshrcなどで、WSL の Git と Git for Windows を自動で使い分けてくれる関数を定義しましょう。
ここではgという名前で定義します。

function g () {
  if [[ `pwd -P` == /mnt/* ]]; then
    git.exe "$@"
  else
    git "$@"
  fi
}

pwdにオプションがあるなんて初めて知りました……。
(シンボリックリンクから Windows ファイルシステムに入ったときのためのオプションです)。

おそらくこれで、g statusなどしても問題なく動いてくれると思います。補完は効きませんが。

おわりに(ポエム)

今ではすっかり、何をするにも WSL から行うようになりました。
コマンドプロンプト?  PowerShell? そんなのもありましたね(環境構築時に使う)。
Git Bash? ……いいやつだったよ(たまに使う)。

やはり慣れ親しんだ Linux コマンドたちで Windows を操作できるのがとてもありがたいです。
さらに、(今回のように)場合によっては Windows のexeを叩けるのでできないことは少ないです。
I/O 遅かったりメモリ大食らいだったりはしますが、それでもとても便利です。