概要
- 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 が置いてあるように見えるが、
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 つ続けて使う
- エスケープする
-