はじめに
普段複数人で開発をしてると、実装を追って調査が必要な場面が多々あります。
実装の影響範囲を調べる時に内部の実装を事細かに追う必要が出てきますが、そんな時git-grepは高速に検索を行える便利なコマンドです。
そんなgit-grepで普段使ってて便利だなと思ったコマンドを何個かあげます。
基本
正規表現を使いたい
git grep -E "regexp"
基本ですが結構利用頻度は高いです。
パターンを検索する場合のgit grep -e
も伏せて利用頻度が高いですが、どちらかと言うとgit grep -e
を使う時はパイプとかで連結させて処理させることが多いかも。
特定の単語を含む上下〇〇行のファイルの中身を見たい
git grep -C 5 -e "word"
設定ファイルとかを読んでいる時とかに、周りの設定ってどうなってたっけ?とか確認したい時に使ったりしてます。
ちなみに、-Cは条件一致時の上下〇〇行の結果を引っ張ってきますが、-Aの場合上〇〇行、-Bの場合下〇〇行の結果を引っ張ってこれます。
git grep -A 5 -B 3 -e "word"
みたいにして上下取得の幅を効かせられたりします。
ただ使う時は設定ちらっと見たいなーくらいの温度感なことが多いので利用頻度としては上の-Cオプションの方を自分はよく使います。
複数の単語が絡んだ文字を検索したい
git grep -e "first word" --and -e "second word"
所謂論理積の検索です。
最初の単語か二つ目の単語かどっちかが検索に含まれている行を知りたい
git grep -e "first word" -e "second word"
これは論理和の検索です。論理積と違うのは、-eオプションを選択した場合はデフォルトで論理和が選択された状態になっているので、複数条件は単純に-eで繋げばいいところです。
明示的に記したい場合は
git grep -e "first word" --or -e "second word"
でいけます。
最初の単語は含んでいるけど、二つ目の単語は含んでない行を知りたい
git grep -e "first word" --and --not -e "second word"
A AND NOT Bの書き方をすることで表現します。
ちなみに
git grep -e "first word" | grep -v "second word"
のように検索条件に一致したものから二つ目の単語を除外する検索方法もあります。
応用
作業分をcommitする前に変更分のメソッドが入っているか先に確認したい
git status -s -uno | awk '{print $2}' | xargs git grep -e 'method name'
git status -s -uno
で作業分でまだgitに追跡されていないファイルを洗い出して、そこから不要な部分を削除し、git grep
でメソッドを絞り出します。
git add -p
などでaddする時に変更差分を確認することもできますが、先に自分のaddした差分に実際想定するメソッドが入ってるかを一撃で探し出せるのがいいとこです。
継承先変更などで削除したクラスのメソッドを抜き出したい
git diff --diff-filter=D --name-only --relative before_hash..after_hash |
xargs git grep -l -e "extends ParentClass" |
xargs git grep -e "function" |
awk '{print $4}' |
grep -o "[a-zA-Z0-9]*" |
grep -v -e '^\s*#' -e '^\s*$'
※ 言語はPHPでの検索を想定してます。
commit-hashの差分から削除されたファイルから特定クラスを継承したメソッドをとってきます。
抽象クラスの親元を変更したりした場合に、どのメソッドを移動させたかを把握するために使います。
まとめ
git grepは使いこなせばこなすほどに味が出てきます。
他のコマンドと組み合わせることで可能性がいくらでも広がってとても楽しいのでスキマ時間にオレオレ最強コマンドを作ってみましょう!