コードの歴史を辿り、「この行は誰が、何の目的で実装したのか」を調べる際に git blame は非常に便利なコマンドです。しかし、プロジェクト全体にPrettierやESLintの自動修正を適用したり、コードフォーマッタを導入した一括整形コミットがあると、git blame の結果がすべてその「フォーマット適用コミット」で上書きされてしまい、本当にロジックを変更したオリジナルのコミットや作者が分からなくなってしまう問題が発生します。
このような「意味的なロジック変更を伴わない一括修正コミット」を git blame の追跡から除外するための仕組みが、Git v2.23から追加された .git-blame-ignore-revs です。
本記事では、この設定ファイルを導入して、ノイズのないクリーンなコード履歴追跡を実現する方法を解説します。
1. .git-blame-ignore-revs の仕組み
.git-blame-ignore-revs は、リポジトリのルートディレクトリに配置するテキストファイルです。このファイルの中に「無視したいコミットのハッシュ(ID)」を列挙しておくと、Gitは git blame 実行時にそのコミットを無視し、その手前で行われたロジックの変更コミットをさかのぼって表示してくれます。
2. 設定手順
ステップ1: 無視したいコミットのハッシュを特定する
コードの一括フォーマットや、ファイル名の一括置換、大規模なリファクタリング(ロジック変更なし)を行ったコミットのハッシュ(例: a1b2c3d4e5f6g7h8i9j0)を確認します。
ステップ2: .git-blame-ignore-revs ファイルを作成する
プロジェクトのルートに .git-blame-ignore-revs という名前のファイルを作成し、以下のように無視したいコミットハッシュを記述します。ハッシュ値の上にはコメント(#)を書いて何のコミットかを明記しておくと親切です。
# Run prettier on entire codebase
a1b2c3d4e5f6g7h8i9j0...
# ESLint --fix auto formatting
e5f6g7h8i9j0a1b2c3d4...
ステップ3: Gitの設定で読み込みを有効化する
作成したファイルをGitのblame処理時に自動適用するように設定します。
# ローカルリポジトリで設定を有効にする
git config blame.ignoreRevsFile .git-blame-ignore-revs
この設定を行うことで、そのPC上のリポジトリで git blame を実行した際、自動的に指定のコミットがスキップされるようになります。
3. チーム全員で設定を共有する
上記の git config は個人のローカル環境でのみ有効なため、チームで共有するためには設定コマンドをプロジェクトで共有するか、またはVS Codeなどのエディタ統合を利用するのが便利です。
現在、GitHubやGitLabなどのコードホスティングサービスも、リポジトリのルートに .git-blame-ignore-revs が置かれている場合、ブラウザ上のBlame表示(「誰が変更したか」の履歴)において自動的にこのファイルを反映する仕様になっています。
そのため、このファイルをGit管理に含めてコミット・プッシュしておくだけで、ブラウザ上でのコードレビュー時にもノイズが排除されます。
4. 一時的に無効化したい場合
もしフォーマットを適用したコミットそのものをblameで追跡したい場合は、コマンドに --no-ignore-revs-file オプションを渡すことで、一時的に除外設定を無視してオリジナルの履歴を表示できます。
git blame --no-ignore-revs-file path/to/file.js
まとめ
フォーマッタによる一括整形コミットはコードの可読性を上げる一方、Gitのコミット履歴分析の障害になるというジレンマがありました。
- ロジックの変わらない整形コミットは
.git-blame-ignore-revsに追加する - ファイルをコミットし、
git config blame.ignoreRevsFileを適用する - GitHub上のBlame表示も自動でクリアになり、チーム全体の開発効率が向上する
初期設定も非常に簡単なので、Prettier等を大規模に導入するタイミングでぜひ導入してみてください。
