Help us understand the problem. What is going on with this article?

インデントコミットで真犯人がわからなくなった場合の git blame

More than 5 years have passed since last update.

例えば fluentdlib/fluent/output.rb ファイルに

config_param :queued_chunk_flush_interval, :time, :default => 1

を追加したコミットがどれかを探したいとします。

しかし、git blame を見るとこんなかんじに、インデントコミットによってほぼ全ての履歴が上塗りされていてどれだかわからない、みたいな状況にどうやって真犯人を探そうかという話です。

901fb2ac4a7f791b5d2ad8660fdd5545.png

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

まずは日付をクリック

520935f87f67180dd9e3da4ebcfa3478.png

インデントコミットの差分が出た。今回はインデント前の所を追いたいので - のリンクをクリック

スクリーンショット 2014-04-01 17.09.58.png

次のコミットが出て来たのでまた日付をクリック

64aa5e5dad1a470a2c52eb7cc3ed39b7.png

出て来た!

9b208939c36270ab5fa336d1db844457.png

これは便利なんじゃないですかね?

5. tig blame を使う

@a_matsuda さんに教えてもらいました。tig blame を使えば , で辿れるとのこと。

$ tig blame lib/fluent/output.rb

640391058803a20000762e78fdb12f08.png

最初はインデントコミットのハッシュが出て来たので、カーソル行に対するその前のコミットを
, で辿る。次の blame が出て来た。

c0582d883ad70d5aa82f2000cff6dd91.png

14d01c71 ... コレかな? Enter を押すと diff が見れるので確認。

74b10a9334b8a11a5243b3addc8427de.png

これだ!見つかった!

最後に

もっとありそうな気がするのでコメントウェルカム!

sonots
A Ruby, Fluentd, and Chainer Committer. SRE Engineer. Qiitaは小ネタの投稿場所として利用しています。業務コードで、なぜそういう書き方をしているのか解説をQiitaに書いて、コードにはQiitaへのリンクを張る、という使い方をしていることが多いです(自己紹介じゃない)
https://medium.com/@sonots
zozotech
70億人のファッションを技術の力で変えていく
https://tech.zozo.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした