🚯

GitHubでファイル差分が表示されない!?レビューを快適にするための差分の非表示ロジックを解説

2024/11/18に公開

はじめに

ある日、プロジェクトのschema.resolver.goファイルが突如としてGitHub上でgenerated fileと判定され、プルリクエストの差分に表示されなくなる問題に直面しました。
差分が表示されないイメージ
「Some generated files are not rendered by default」となり差分が表示されない様子
schema.resolver.goファイルは、GraphQLサーバーの実装ファイルでgqlgenによってメソッドのシグネチャのみが自動生成されますが、その実装部分は我々が記述しなければなりません。そのため、コードレビューは不可欠ですが、GitHubで差分が表示されなくなったことでレビューが困難になり、その解消方法に頭を悩ませることになりました。

この記事では、本事象が発生した原因と解決方法、プルリクエスト上で差分を表示させない方法について説明していきます。

明示的に差分を非表示にする方法

GitHubは、あるファイルがgenerated fileであると判断した場合、その差分は表示されません。これにより、自動生成されたコードがレビューのノイズになることを防ぎます。
一般的に、GitHub上で差分を非表示にするには、.gitattributesファイルでlinguist-generated属性を設定する必要があります。

.gitattributes
file/path linguist-generated=true

https://docs.github.com/en/repositories/working-with-files/managing-files/customizing-how-changed-files-appear-on-github

しかし、今回問題となったschema.resolver.goは、linguist-generated属性を設定していませんでした。

暗黙的に差分が非表示になるロジック

GitHubでは前述したような手動でgenerated fileと明示する方法の他に、言語毎にgenerated file自動判定するロジックが存在しています。

このロジックを調査したところ、Go言語では// Code generatedというコメントがファイル冒頭に含まれると自動的にgenerated fileと見なされることが分かりました。

https://github.com/github-linguist/linguist/blob/f164d13fa618023ecf2d8f2ed9a6ce5fae731346/lib/linguist/generated.rb#L328-L333

問題の原因

schema.resolver.goの内容を確認したところ、まさに// Code generatedというコメントがファイル冒頭に追加されていることが判明しました。
このコメントはgqlgenのバージョンv0.17.21以上で新たに挿入されるようになったもので、gqlgenをアップデートした際に追加され、このバージョン以降GitHubがgenerated fileと判断する要因となったのです。

https://github.com/99designs/gqlgen/pull/2434

解決方法

この問題を解消するには、.gitattributesで明示するか、gqlgenの設定ファイルで// Code generated部分の生成を省略するか、2パターンの解消方法があります。

1. .gitattributesで明示する

前述したように、.gitattributesファイルでlinguist-generated属性を用いることで、GitHub上で差分の表示条件を明示的に設定できます。
ここでは差分として表示したい(=生成ファイルと判定してほしくない)ため、linguist-generated=falseを設定します。

.gitattributes
path/to/schema.resolver.go linguist-generated=false

2. gqlgenの設定ファイルで// Code generated部分の生成を省略する

見出しの通り、gqlgenではコードコメントの生成を省略する設定が可能です。

gqlgen.yml
omit_gqlgen_file_notice: true # ファイル冒頭のコメント(`// Code generated`を含む)を省略

これによりschema.resolver.goを再生成すると、冒頭のコメントが削除されていることが確認できます。

schema.resolver.go
package hoge

- // This file will be automatically regenerated based on the schema, any resolver implementations
- // will be copied through when generating and any unknown code will be moved to the end.
- // Code generated by github.com/99designs/gqlgen version v0.17.30

https://github.com/99designs/gqlgen/pull/2617

まとめ

この記事では、schema.resolver.goがGitHub上で「generated file」として扱われ、差分が表示されなくなった問題の原因と解決策について説明しました。
原因はgqlgenのアップデートで追加された// Code generatedコメントがGitHubの自動判定ロジックに引っかかったことでした。私はこの自動判定ロジックの存在を知らなかったため、解決までに手間取りました。

GitHubは言語ごとに異なる基準でgenerated fileを判定しています。特にレビューが必要な自動生成ファイルを扱う際には、この判定ロジックを認識しておくと役立つでしょう。


再掲

https://docs.github.com/ja/repositories/working-with-files/managing-files/customizing-how-changed-files-appear-on-github

https://github.com/github-linguist/linguist/blob/f164d13fa618023ecf2d8f2ed9a6ce5fae731346/lib/linguist/generated.rb

GitHubで編集を提案
Hacobell Developers Blog

Discussion