はじめに
git grep
便利ですよね。エンジニアなら毎日何回も叩いてるんじゃないかなーと思います。
ただ普通に使うと、今いるブランチの今のソースコードの中からしか検索できません。
そこで、renameされたファイルのrename前や、削除されたファイルも含め全履歴の中から検索する方法を調べた所、このような手段を発見↓
$ git grep -w '検索ワード' $(git rev-list --all)
rev-list
など見慣れない部分が結構あったので分解してみた。
分解
grep
の-w
オプションとは?
単語で検索する。
したがって、全履歴から検索するという目的においては、あってもなくてもよい。
$()
とは?
$()
内のコマンドを実行して実行結果を出力し展開する。
以下であれば$(git rev-list --all)
をまず先に評価して、grep
の引数として渡します。
$ git grep -w '検索ワード' $(git rev-list --all)
git rev-list
とは?
コミットハッシュを返すコマンド。
--all
オプションをつけることで、今いるブランチの全コミットハッシュを返す。
まとめると
$ git grep -w '検索ワード' $(git rev-list --all)
まず、$(git rev-list --all)
が実行され、全コミットハッシュを取得します。
全コミットハッシュは、git grep -w '検索ワード'
に追加の引数として渡されます。
git grep
は引数としてコミットハッシュを渡すと、そのコミット内で検索します、したがって全コミットハッシュを渡すことで全履歴からの検索が実現されているわけです。
用途
使い道としては、ちょっと限定的な状況ではありますが、例えばフロントで使われていないAPIをバックエンドで見つけた時に、フロントの過去のgitの全履歴を検索して、過去に使われていた事を確かめたりとかできます。
(このコマンドを使うと、ファイル名が変更されていたり削除されたファイルからも検索できるので、そういった漏れも起きません)
そうすることで、存在する理由が不明なAPIが、フロントで使用しなくなった時に削除し忘れたものだという事が特定できます。
多分他にもいろいろ使い道はあると思うので、あくまで一例です!
参考
https://uxmilk.jp/27666
https://webbibouroku.com/Blog/Article/shell-paren-brace-bracket#outline__6
https://uxmilk.jp/27666