Konboi Note

.git-blame-ignore-revs ファイルを使ってgit blameの結果を綺麗に保つ

· Konboi

はじめに

先日、関わっているプロジェクトで使っている macisamuele/language-formatters-pre-commit-hooksを長らくアップデートしていなかったのでアップデートした。
すると内部で使用しているフォーマッタのバージョンも上がり1フォーマットに微妙な差が出てしまった。

なにも考えずに差分をcommitしても良かったが、コードのフォーマット変更のコミットを追加してしまうと、後々 git blame で本来の変更コミットが追いづらくなってしまうのは避けたかった。

そこでプロジェクトに以下のような .git-blame-ignore-revs ファイルを導入することで解決した。

# This is a file used by GitHub to ignore the following commits on `git blame`.

#

# You can also do the same thing in your local repository with:

# $ git config --local blame.ignoreRevsFile .git-blame-ignore-revs


<Commit Hash 1>
<Commit Hash 2>
...

–ignore-rev / –ignore-revs-file オプション

–ignore-rev オプション

git blame には --ignore-rev2 というオプションがある。

Ignore changes made by the revision when assigning blame, as if the change never happened.

簡単に言うと該当のcommitを git blame 上で無視してくれる。
今回のようにフォーマットのみの変更を無視し、本来の意図のある変更の commit を表示してくれる。

–ignore-revs-file オプション

--ignore-revs-file 3 オプションはしてしたファイルに commit hash を複数記述することで、それらの commit hash をまとめて git blame 時に除外してくれる。

自分は最初に挙げたサンプルの通り git config --local blame.ignoreRevsFile .git-blame-ignore-revs の設定をしている。

GitHubでのサポート

GitHub でもこの機能をサポートしている。4
リポジトリの直下に .git-blame-ignore-revs ファイルを置き除外したいcommit hashを書くことでGitHub上で変更を確認するときも記述した commit hash を除外してくれる。

知った経緯

Rubyのインデントがタブとスペースと混在しているのをスペースに変更するPRで --ignore-rev オプションおよび GitHub の機能を知った。

さいごに

コードフォマットの変更のみの commit が積まれると git blame で実際の変更の commit が追いづらくなります。

プロジェクトの途中でコードフォーマッターを入れたり、バージョンが上がってフォーマット方法が変わった時などはこの方法を試してみてはいかがでしょう。

参考URL