GitLab:比較の API が「"compare_timeout": true」を返す
2つのブランチ・タグ・コミットを GET /projects/:id/repository/compare で比べると、GitLab が "compare_timeout": true を返すことがあります。GitLab の文書では、比較がサイズの上限を超えたか時間切れになった、という意味で、diffs の配列は欠けているかもしれません(Repositories API・2026年10月29日に確認)。GitLab のソースでは、この欄は差分の一覧があふれたかどうかです。かかった時間に関係なく、そのインスタンスが1つの差分に出すより多くのファイルか行が変わっていれば true になります。
GET /api/v4/projects/:id/repository/compare?from=main&to=feature
{"commit": {...},
"commits": [...],
"diffs": [...],
"compare_timeout": true,
"compare_same_ref": false,
"web_url": "https://gitlab.example.com/group/project/-/compare/main...feature"}
この欄の意味
API の比較の答え(lib/api/entities/compare.rb)は、compare_timeout に、返す差分の集まりの overflow? を入れています。その集まりは、インスタンスの差分の設定で作られます(app/models/commit.rb の max_diff_options)。ファイルは diff_max_files まで、変わった行は diff_max_lines までです。名前は時間切れでも、ふつうの理由は大きさです。上限より多くのファイルか行が変わった比較は、何度聞いても true を返します。
- コミットは全部そろう:GitLab によれば、
compare_timeoutが true でもcommitsの配列はいつも全部そろっています。 - 差分は欠ける:上限を超えた分のファイルは
diffsに入りません。1つのファイルでも、中身が上限を超えるとdiffが空の文字列で来ることがあります。 - GitLab 18.4 からはファイルごとに:
collapsedが true なら、そのファイルの差分は省かれたが、求めれば取れます。too_largeが true なら、省かれていて取れません。
上限
Diff limits(2026年10月29日に確認)から:
- Maximum diff files:1つの差分で変わったファイルの数。既定は 1000、最大 3000。
- Maximum diff lines:1つの差分で変わった行の数。既定は 50,000、最大 100,000。
- Maximum diff patch size:既定は 200 KB、最大 500 KB。上限を超えた差分は画面で「大きすぎる」と出て開けません。上限の 10% に届いた差分は畳まれ、開くリンクが付きます。
GitLab Self-Managed と GitLab Dedicated では、管理者が Admin > Settings > General > Diff limits で変えられます。GitLab.com では変えられません。
比較がこれほど大きくなる理由
- リベースの後に直接比べた:
straight=trueなら、GitLab はfromとtoを直接比べます。動いた対象のブランチへリベースした後だと、前の head と新しい head の差には、ブランチの新しいコミットだけでなく、その間に対象のブランチが増やした分が全部入ります。 - 古い分かれ目から比べた:
straightを付けなければ(既定は false)、分かれ目(merge base)から比べます。長く続くブランチとデフォルトのブランチの間では、それでも何千ファイルになることがあります。 - 生成されたファイルや取り込んだファイル:ロックファイル・ビルドの出力・写したライブラリは、それに触れる比較のたびにファイルと行を大きく増やします。
直す所
- コミットを読み、小さく分けて比べる:
commitsの配列は全部そろうので、短い範囲で比べ直すか、コミットごとにGET /projects/:id/repository/commits/:sha/diffで差分を読みます。 - 手元で比べる:一覧が全部要るなら、
git diff --stat from..toにはこの上限がありません。 - 比べ方を選ぶ:リベースの後は、分かれ目から比べれば(
straightを付けない)、ブランチが変えた分だけが見えます。 - 自分のインスタンスなら:管理者が Maximum diff files と Maximum diff lines を、ファイル 3000・行 100,000 まで上げられます。
IntelliJ IDEA で GitLab のマージリクエストを扱うなら
Lesstep の Merge Request Inbox for GitLab は JetBrains の IDE 2024.1 以降のプラグインです。マージリクエストを前に開いた後に変わったファイルに印を付けます。そのために、前に見た head と新しい head を直接比べます。GitLab が compare_timeout に true を返すと、その push がどのファイルに触れたか分からないので、その push の「変わった」の印は出さず、そのマージリクエストの「見た」の印を消します。変わったかもしれないファイルに「見た」が残らないようにするためです。読むのは無料、承認・コメント・マージは Pro(月 US$1.50・30日の試用つき)です。
GITLAB は GitLab Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitLab Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
More: GitLab の MR の変更が欠ける(「1000+」・too_large) · GitLab の 429「Retry later」(回数の上限) · GitLab のマージの断り(405・409・422) · GitLab の MR の一覧の断り(400・404) · GitLab の 404「Project Not Found」 · JetBrains の IDE で GitLab のマージリクエストを扱う · English