GitLab がコメントやスレッドの操作を断った理由
マージリクエストへのコメントは、GitLab の discussions API を通ります。新しいスレッド(POST /projects/:id/merge_requests/:iid/discussions。差分の行には position を付けて)、返信(…/discussions/:discussion_id/notes)、スレッドの解決と再開(PUT …/discussions/:discussion_id に resolved)、提案された変更の適用(PUT /projects/:id/suggestions/:id/apply)です。以下はすべて GitLab のソース(lib/api/discussions.rb・lib/api/helpers/notes_helpers.rb・lib/api/suggestions.rb、コメントと提案のモデルと権限の決まり)と文書を 2026年10月24日に読んで確かめたものです。
新しいコメント
- 403
{"message":"403 Forbidden"}:あなたのアカウントは、このマージリクエストにコメントできません。GitLab の権限の一覧では、マージリクエストへのコメントは Planner の役割から上です。だれかが議論をロックしていると、コメントできるのはプロジェクトのメンバーだけです。 - 400
Note {:line_code=>["can't be blank", "must be a valid line code"]}(差分の行へのコメント。和訳:行の印が空です・正しい行の印でなければなりません):あなたが指した行が、その版の差分に見つかりませんでした。公開の報告ではこの形で引かれています。いまの GitLab のソースが使う Ruby 3.4 のサーバーでは、同じ答えがNote {line_code: [...]}と書かれます。ソースと文書から、よくある原因は次のとおりです。positionの3つのコミット(base_sha・start_sha・head_sha)が、このマージリクエストのどの版でもない。行の番号が逆の側のもの。変わっていない行にold_lineとnew_lineの片方しか渡していない(両方が要ります)。 - 400
Note {:position=>["is incomplete"]}(和訳:position が足りません):positionの一部、たとえば3つのコミットのどれかやファイルのパスが抜けています。
api の権限が無いトークンも 403 で断られますが、そのときの答えには insufficient_scope と書いてあります。足す権限の見つけ方へ。
返信
- 404
{"message":"404 Discussion Not Found"}:このマージリクエストに、あなたが読める、その ID のスレッドがありません。 - 400
Replies to system notes are not allowed.(和訳:システムの記録には返信できません):そのスレッドは GitLab 自身の記録(「added 2 commits」など)で始まっていて、マージリクエストではそれに返信できません。 - 403:新しいコメントと同じです。
スレッドの解決と再開:何も書いていない 403
{"message":"403 Forbidden"} には、ソースでは原因が2つあり、答えはどちらも同じです。
- あなたのアカウントは解決できない。GitLab の文書では、スレッドの解決には Developer・Maintainer・Owner の役割か、マージリクエストの作成者であることが要ります。ソースでは、スレッドを始めた人も解決できます。議論がロックされていると、解決できるのはプロジェクトのメンバーだけです。
- そもそも解決できないもの。普通のコメント(だれもスレッドとして返信していないもの)は解決できません(文書:だれかが返信するとスレッドになります)。GitLab 自身の記録も同じです。API はこれらにも 400 でなく同じ 403 で答えます。
無いスレッドの ID は {"message":"404 Discussion Not Found"} です。
提案の適用
- 403
{"message":"403 Forbidden"}:適用すると変更がソースブランチにコミットされるので、ソースではそのブランチに push できる権限が要ります(フォークならフォークの)。 - 404
Suggestion is not applicable as the suggestion was not found.(和訳:提案が見つからないので適用できません) - 400、理由は GitLab の文で。たとえば:
Can't apply this suggestion.(和訳:この提案は適用できません):もう適用済みです。This merge request was merged. To apply this suggestion, edit this file directly.(和訳:マージ済みです。ファイルを直接編集してください)。閉じているときは…is closed…Can't apply as the source branch was deleted.(和訳:ソースブランチが削除されたので適用できません)Can't apply as this line was changed in a more recent version.(和訳:新しい版でこの行が変わったので適用できません。複数行ならthese lines):後からの push がその行を変えました。A file has been changed.(和訳:ファイルが変わりました):ソースブランチに、提案を書いた版より新しいコミットがあります。This suggestion already matches its content.(和訳:もう提案どおりの中身です)
いまどうなっているか
curl -H "PRIVATE-TOKEN: your-token" "https://gitlab.com/api/v4/projects/group%2Fproject/merge_requests/42/discussions"
スレッドごとに individual_note(普通のコメントなら true)があり、その中のコメントごとに resolvable・resolved・system(GitLab 自身の記録か)があります。マージリクエストそのもの(…/merge_requests/42)には discussion_locked と、最新の版の3つのコミットである diff_refs があります。gitlab.com はあなたのサーバーの住所に置き換えてください。
直し方
- 400「line_code」:3つのコミットはマージリクエストの
diff_refsから取る。足した行はnew_line、消した行はold_line、変わっていない行は両方を渡す。 - コメントや返信の 403:
discussion_lockedが true なら、メンバーにロックを外すかコメントを頼む。そうでなければ、メンテナーにコメントできる役割を頼む。 - 解決の 403:
resolvableが false なら、解決するものはありません。コメントに返信してスレッドにする。そうでなければ、マージリクエストの作成者か、Developer 以上の役割の人に頼む。 - 適用の 400:更新して新しい版を見る。提案が合わなくなっていたら、ファイルを直接編集する。403:ソースブランチに push できる人に頼む。
IntelliJ IDEA で GitLab のマージリクエストを見るなら
Lesstep の Merge Request Inbox for GitLab は、JetBrains IDE(2024.1 以降)のプラグインです。マージリクエストそのものや差分の行へのコメント(行の範囲。GitLab が範囲を断ったときは範囲の最後の行へ)、返信、スレッドの解決と再開、提案された変更の適用ができます。「解決」は GitLab が解決できると言うスレッドにだけ、「適用」は GitLab が適用できる間だけ出し、GitLab 自身の記録は出しません。GitLab が断ったときは、そう言います。403 なら GitLab の文を添えて、プロジェクトでの役割か設定があなたのアカウントに許していない可能性がある、と。ほかの断りは GitLab の文で伝えます。見るのは無料、承認・コメント・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
GITLAB は GitLab Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitLab Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:GitLab の承認の断り(401・409) · GitLab のマージの断り(405・409・422) · GitLab の「insufficient_scope」 · GitLab の 401「invalid_token」 · GitLab の 404「Project Not Found」 · GitLab のマージリクエストが作れない(409・422・400) · GitLab のリベースの断り・失敗(403・409) · GitLab の MR の一覧の断り(400・404) · GitLab の MR の変更が欠ける(「1000+」・too_large) · GitLab の 429「Retry later」(回数の上限) · GitLab の「compare_timeout」(差分の上限) · JetBrains の IDE で GitLab のマージリクエストを扱う · English