.git-blame-ignore-revs ファイルを使ってgit blameの結果を綺麗に保つ
はじめに
先日、関わっているプロジェクトで使っている 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-rev
2 というオプションがある。
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
google/google-java-formaのバージョンが 1.14.0 から 1.18.1 へアップデート ↩︎
https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revltrevgt ↩︎
https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revs-fileltfilegt ↩︎
https://github.blog/changelog/2022-03-24-ignore-commits-in-the-blame-view-beta/ ↩︎