プログラミング

指定期間内の全てのGitコミットのファイルから文字列を正規表現検索する

Gitされているファイルがいくつもあり、そしてGitのコミットの数もいくらかある。そしてそれらの過去のファイルのデータから、文字列を検索、それも正規表現検索したい…なんてこと、たまにありますよね!

僕のケースですが、先日、ノートを保管しているファイルにあるはずのデータがなかったという事件がありました。”洋書が買える東京のお店”的なノートを取っていたのが記憶にあるのですが、なぜか見つからない。おそらく”紀伊國屋書店”というキーワードはそのノートの中に書いていたはずだから、このキーワードでGitを遡って検索してみよう…ということでした。

はい。まず以下は複数のコミットの全てのファイルから正規表現検索する例です。

git grep "紀伊國屋書店" 7d48e6e 4ccf24f 78e1c4b  

コミットのハッシュを並べてしまえばいいので、次はgit logから全ての指定期間のコミットハッシュを出力したい、ということになります。
以下は最近90日間のコミットハッシュを出力します。

git log --after="@$( date --date "-90 days" +%s )" --pretty=format:"%h"

んで、その全ての指定期間のコミットに対してgrepを掛けます。

git grep "紀伊國屋書店" $( git log --after="@$( date --date "-90 days" +%s )" --pretty=format:"%h" )

次に、簡単な出力のフィルタリングをしてみます。
僕はよく調べてないので不確かですが、おそらくgit grepのオプションにインバートマッチ(否定マッチ)とかあると思いますが、agとかawkとかgrepでパイプ処理しても良いと思います。

git grep "紀伊國屋書店" $( git log --after="@$( date --date "-90 days" +%s )" --pretty=format:"%h" ) | ag -v "紀伊國屋書店ウェブストア" 

そして、上記のコマンドによって以下のように出力を得ることができました。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_cae00d2f-3b04-49e3-abb6-4b2c98956dc7.png