GitLab:マージリクエストの変更が途中で切れる・404 になる
GitLab の REST API は、マージリクエストが変えたファイルを、差分の一覧(GET /projects/:id/merge_requests/:merge_request_iid/diffs・GitLab 15.7 から)でページに分けて、古い GET /projects/:id/merge_requests/:merge_request_iid/changes(15.7 で非推奨・API v5 で削除の予定)で1回の答えにまとめて渡します。どちらも GitLab がそのマージリクエストについて保存したものを返し、どこまで保存するかは差分の上限で決まります。以下は、2026年10月25日に gitlab.com が返した答えと、その裏にある GitLab の文書の決まりです。
HTTP/1.1 404 Not Found
{"message":"404 Not found"}
差分の上限
- 上限は3つ:変わったファイルの数、変わった行の数、差分全体の大きさです。画面だけでなく API にもかかります。GitLab Self-Managed の既定は1,000ファイル・50,000行・200 KB で、管理者は3,000ファイル・100,000行・500 KB まで上げられます。GitLab.com は3,000ファイル・100,000行・200 KB で、変えられません。
- 折りたたみと「Too large」:差分が上限の10%に届くと、GitLab はファイルを折りたたんで見せます。上限を超えた差分は「Too large」になり、画面で開けません。
200 なのにファイルや差分が欠けるとき
changes_countの末尾が「+」:数でなく文字列です。表示・保存するには変更が多すぎるマージリクエストでは GitLab が上限で止め、文書は"1000+"を挙げています。差分の一覧にはこれを示す印が無いので、受け取ったファイルの数を、マージリクエスト(GET /projects/:id/merge_requests/:merge_request_iid)のchanges_countと比べます。/changesの"overflow": true:上限で結果が切られています。access_raw_diffs=trueを付けると、GitLab はデータベースでなく Gitaly から差分を読みます。遅くなりますが、データベースの上限はかかりません(Gitaly 自身の上限は残ります)。- ファイルの
"collapsed": trueか"too_large": true:そのファイルの差分が外されています。collapsed は求めれば取れ、too_large は取れません。この2つは GitLab 18.4 で差分の一覧に加わりました。 - 作ったばかりのマージリクエスト:
changes_countとdiff_refsは最初は空で、GitLab が差分を作り終えると少しして入ります。 - ページ:既定で1ページ20ファイル、
per_pageで100まで(gitlab.com は500を頼んでも100ずつでした)。x-totalとx-next-pageが、ファイルの数と次のページを示します。
/diffs や /changes の 404
404 Not found:プロジェクトにその番号のマージリクエストが無い(番号はマージリクエストの住所にあるiidで、全体のidではありません)か、トークンからプロジェクトが見えません(住所か権限かへ)。- 15.7 より古い GitLab には差分の一覧が無いので、
/diffsは 404 です。/changesを使います。
直し方
- 上限を超えたとき:ブランチを手元で比べる。GitLab はマージリクエストの先頭を
refs/merge-requests/番号/headに置いています。git fetch origin refs/merge-requests/番号/headのあと、git diff origin/ターゲットのブランチ...FETCH_HEADですべてのファイルが見えます。 - GitLab Self-Managed なら、管理者が Admin > Settings > General > Diff limits で上限を上げられます(3,000ファイルまで)。上げるほどインスタンスの負担は増えます。
- データベースから外された差分:
/changesにaccess_raw_diffs=trueを付けて聞くか、2つのコミットでファイルを読む。
IntelliJ IDEA で GitLab のマージリクエストを見るなら
Lesstep の Merge Request Inbox for GitLab は、JetBrains IDE(2024.1 以降)のプラグインです。マージリクエストの変更ファイルは差分の一覧から100件ずつ3,000ファイルまで読み、一覧が 404 の GitLab では /changes から読みます。ファイルはそれぞれ IDE の差分で開き、マージベースと先頭のコミットでファイル全体を読むので、GitLab が差分を外したファイルも変更が見えます。1.0.17 からは、GitLab が先頭のファイルだけを残したとき(changes_count の末尾が「+」か "overflow": true)や3,000を超えるとき、既読の数のところで、先頭のファイルだけを表示していて残りは git diff で見えると言います(前は何も言わずに一覧が終わっていました)。作った直後のマージリクエストは、GitLab が差分を作り終えるまで数秒聞き直します。読むのは無料、承認・コメント・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
GITLAB は GitLab Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitLab Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:GitLab の 404「Project Not Found」 · GitLab の MR の一覧の断り(400・404) · GitLab の 429「Retry later」(回数の上限) · GitLab の 401「invalid_token」 · GitLab の「insufficient_scope」 · GitLab のマージの断り(405・409・422) · GitLab の承認の断り(401・409) · GitLab のコメント・スレッドの断り(400・403) · GitLab のマージリクエストが作れない(409・422・400) · GitLab のリベースの断り・失敗(403・409) · GitLab の自動マージの断り(405)・取り消し · GitLab の「compare_timeout」(差分の上限) · JetBrains の IDE で GitLab のマージリクエストを扱う · English