GitLab の 404「Project Not Found」
GitLab は、そのパスにプロジェクトが無いときも、あっても見る権限が無いときも、同じ答えを返します。非公開のプロジェクトと、存在しないプロジェクトを区別しません。なので直すのは、住所か権限のどちらかです。トークンそのものがおかしいときは 401(「invalid_token」か「401 Unauthorized」)、スコープが足りないときは 403 の「insufficient_scope」になります。
答えの全体
2026年10月24日に、gitlab.com へトークンなしで:
curl -i "https://gitlab.com/api/v4/projects/no-such-group%2Fno-such-project"
HTTP/1.1 404 Not Found
{"message":"404 Project Not Found"}
プロジェクトのマージリクエストとパイプライン(/projects/:id/merge_requests・/projects/:id/pipelines)も同じ答えです。GitLab のソース(lib/api/helpers.rb の find_project!)では、存在しないプロジェクトも、呼んだ人が読めないプロジェクトも、どちらも not_found!('Project') に行き着きます。GitLab の状態コードの説明も、404 を「ID が見つからない、または、その人にアクセスの権限が無い」としています。GitLab の GraphQL の API は 404 を返さず、どちらの場合も {"data":{"project":null}} です。
「404 Project Not Found」と「404 Not Found」
{"message":"404 Project Not Found"}:GitLab は住所をプロジェクトとして読み、見せられるプロジェクトが無かった。{"error":"404 Not Found"}(「Project」が無い):住所がどの API にも当てはまらなかった。よくある原因は、プロジェクトのパスの/をそのまま書いたこと。/projects/gitlab-org/gitlabはこの答えになり、/projects/gitlab-org%2Fgitlabなら通ります。GitLab の REST API の説明:グループとプロジェクトのパスは URL エンコードし、/は%2Fと書く。API の前にあるもの(たとえば Apache)がそれを戻してしまうと、当てはまらずに 404 になる。
プロジェクトがあるとき
- トークンなし。トークンが無いと、GitLab は公開のプロジェクトしか見せません。それ以外は、存在しないのと同じ 404 です。
- トークンのアカウントがプロジェクトを見られない。メンバーになったことが無いか、プロジェクトやグループから外された。個人アクセストークンが見られるのは、そのアカウントが見られる物です。
- プロジェクトやグループのアクセストークン。プロジェクトアクセストークンのボットユーザーは自分のプロジェクトのメンバーで、ほかには加えられません(プロジェクトアクセストークン)。グループアクセストークンのボットユーザーは自分のグループのメンバーで、その下のサブグループとプロジェクトのメンバーでもあります(グループアクセストークン)。それ以外の非公開のプロジェクトは 404 です。
トークンでプロジェクトが見えるかを確かめるには:
curl -i --header "PRIVATE-TOKEN: your-token" "https://gitlab.com/api/v4/projects/your-group%2Fyour-project"
200 でプロジェクトが返れば見えています。その場合は、失敗している道具が使っている住所を見ます。Self-Managed なら gitlab.com の代わりにそのサーバーの住所で。
住所が違うとき
- 名前ではなくパス。GitLab の説明:プロジェクトのパスは名前と同じとは限らない。パスはプロジェクトの URL か、プロジェクトの設定の General > Advanced > Change path にあります。
- パスの全体。グループは入れ子になるので、パスはプロジェクトの URL のサーバーより後ろ全部で、
/はすべて%2Fと書きます:group%2Fsubgroup%2Fproject。 - 別のサーバー。自社の GitLab のプロジェクトは gitlab.com にはなく、その逆も同じです。
名前を変えた・移したプロジェクト
古いパスでも 404 にはなりません。読む(GET)と、プロジェクトの番号の住所へ 301 で案内されます。番号はパスを変えても変わりません。2026年10月24日に、/api/v4/projects/gitlab-org%2Fgitlab-ce は /api/v4/projects/13083 への 301 でした。それ以外(承認・コメント・マージなど)は 405 の Non GET methods are not allowed for moved projects です(同じ find_project!)。GraphQL は古いパスをたどりません。同じ日に project(fullPath: "gitlab-org/gitlab-ce") は null でした。新しいパスを使ってください。
IntelliJ IDEA で GitLab の MR とパイプラインを見るなら
Lesstep は、JetBrains IDE(2024.1 以降)のプラグインを2つ作っています。Merge Request Inbox for GitLab と Pipeline Inbox for GitLab CI です。どちらもプロジェクトのパスを、サブグループも含めて Git のリモートから取り、自分でエンコードします。GitLab がそこにプロジェクトを見せないときは、トークンが無ければ、プロジェクトが非公開か存在しないと言ってトークンの設定を勧め、トークンがあれば、そのパスにトークンで見えるプロジェクトが無いと言います。どちらも設定を開けるようにします。名前を変えた・移したプロジェクトを古いパスのままのクローンで開いたときは、どちらも GitLab にいまの場所を聞いてそこを使います。MR のプラグインは承認・コメント・マージ・変更の依頼で(1.0.13 から)、パイプラインのプラグインは一覧と再実行・取り消し・実行で(1.0.14 から)。読むのは無料、承認・コメント・マージや、パイプラインの再実行・取り消し・実行は Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
GITLAB は GitLab Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitLab Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:GitLab の 404「Group Not Found」 · 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 の MR の一覧の断り(400・404) · GitLab の MR の変更が欠ける(「1000+」・too_large) · GitLab の 429「Retry later」(回数の上限) · GitLab の「compare_timeout」(差分の上限) · JetBrains の IDE で GitLab のマージリクエストを扱う · JetBrains の IDE で GitLab のパイプラインを扱う · English