LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-30

概要

  • 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 つ続けて使う
    • エスケープする
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0