例えば fluentd の lib/fluent/output.rb ファイルに
config_param :queued_chunk_flush_interval, :time, :default => 1
を追加したコミットがどれかを探したいとします。
しかし、git blame を見るとこんなかんじに、インデントコミットによってほぼ全ての履歴が上塗りされていてどれだかわからない、みたいな状況にどうやって真犯人を探そうかという話です。
1. git blame -w を使う
インデントコミットを無視したいだけであれば git blame の -w
オプションが使える。-w は比較の際に whitespace を無視してくれるオプション。git diff にもあるよね。
$ git blame -w lib/fluent/output.rb
... (省略)
14d01c71 (Masahiro Nakagawa 2013-03-27 03:56:51 +0900 181) config_param :queued_chunk_flush_interval, :time, :default => 1
... (省略)
おぉ、見つかった。14d01c71 か => https://github.com/fluent/fluentd/commit/14d01c71eb7b0d788184cdd0af6085cdceefa1b8
2. git log -S を使う
git log の -S オプションを使う。-S は指定した文字列にマッチする + diff のある commit log のみ出してくれるオプション。-G で正規表現指定もできる。
$ git log -S 'config_param :queued_chunk_flush_interval, :time, :default => 1' lib/fluent/output.rb
commit 14d01c71eb7b0d788184cdd0af6085cdceefa1b8
Author: Masahiro Nakagawa <repeatedly@gmail.com>
Date: Wed Mar 27 03:56:51 2013 +0900
Add queued_chunk_flush_interval to BufferedOutput
おぉ、見つかった。14d01c71 か => https://github.com/fluent/fluentd/commit/14d01c71eb7b0d788184cdd0af6085cdceefa1b8
3. git-strata を使う
-w オプション実装してくれるっぽいのでちょっと待ってね。
4. vcs-ann を使う
@tanaka_akr さんが vcs-ann というものを作ったと教えてくれたので、試してみた。
w3m で開いて青文字部分のリンクをクリックして、対話的に履歴を追いかけていくことができる!
$ gem install vcs-ann
$ vcs-ann lib/fluent/output.rb
まずは日付をクリック
インデントコミットの差分が出た。今回はインデント前の所を追いたいので - のリンクをクリック
次のコミットが出て来たのでまた日付をクリック
出て来た!
これは便利なんじゃないですかね?
5. tig blame を使う
@a_matsuda さんに教えてもらいました。tig blame を使えば , で辿れるとのこと。
$ tig blame lib/fluent/output.rb
最初はインデントコミットのハッシュが出て来たので、カーソル行に対するその前のコミットを
, で辿る。次の blame が出て来た。
14d01c71 ... コレかな? Enter を押すと diff が見れるので確認。
これだ!見つかった!
最後に
もっとありそうな気がするのでコメントウェルカム!