Posted at

git for Windows の git grep でスラッシュ始まりの文字列を検索すると必ずヒットしなくなる


概要


  • Git for Windows の git grep で、スラッシュから始まる文字列を検索すると、本来ヒットすべき文字列がヒットしなくなる


    • スラッシュから始まる文字列とは: /, /fuga など




環境


  • git version 2.22.0.windows.1

  • Terminal は mintty


再現手順


準備 1: テスト用のファイルを作る

$ echo 'hoge' > test.txt

$ echo '/fuga' >> test.txt

$ echo 'fo/o' >> test.txt

$ cat test.txt
hoge
/fuga
fo/o


準備 2: テスト用ファイルをステージさせる

$ git init .

Initialized empty Git repository in C:/dev/src/test-dir/.git/

$ git add test.txt

これで test.txt が git grep の対象となった。


本題: いろいろなキーワードで git grep してみる


スラッシュなし: 想定通りヒットする

$ git grep 'hoge'

test.txt:hoge


スラッシュから始まる: ヒットしない

$ git grep '/'

$

$ git grep '/fuga'
$

スラッシュを検索キーの冒頭にさえ入れなければ、想定通りヒットする。

$ git grep 'fuga'

test.txt:/fuga

$ git grep 'fo/'
test.txt:fo/o

# こういうのも OK
$ git grep '\/'
test.txt:/fuga
test.txt:fo/o


原因

https://github.com/git-for-windows/git/issues/2109

https://github.com/git-for-windows/build-extra/blob/master/ReleaseNotes.md#known-issues

スラッシュ始まりのパラメータを与えた場合、POSIX のパスを Windows で扱えるようにするため、文字列の変換が行われる模様。

例えば、

$ ll /git-bash.exe

-rwxr-xr-x 1 Tsubasa Ogawa 197609 152600 6月 8 15:14 /git-bash.exe*

ターミナル上では root 直下に git-bash.exe が置いてあるように見えるが、

image.png

Windows 上のファイルシステムでは C:\... のようなドライブレターから始まるパスとなっている。つまり、スラッシュ始まりの文字列を渡すと C:\... のような prefix が付与されてしまう。


対策

公式がお勧めしているのは MSYS_NO_PATHCONV=1 を用いる方法で、例のパス変換を無効化してくれる。

$ MSYS_NO_PATHCONV=1 git grep '/'

test.txt:/fuga
test.txt:fo/o

もしくは、スラッシュを 2 つ続ける方法もある

git grep '//'

test.txt:/fuga
test.txt:fo/o


まとめ


  • Git for Windows で git grep するときは、スラッシュ始まりのキーワードを使わないように注意

  • もしどうしても使いたい場合、以下でパス変換を回避する



    • MSYS_NO_PATHCONV=1 を使う

    • スラッシュを 2 つ続けて使う

    • エスケープする




余談


  • 筆者は一度これがきっかけで障害を起こしました 😂 (影響調査で漏れが発生)


    • 再発防止策として、極力 git grep は使わずに grep を使うように心がけています。遅いけど…



      • grep だとうまくいく