Forgejo・Gitea の 404「The target couldn't be found.」と「not found」
サーバーは、存在しないリポジトリにも、存在するが見る権限のないリポジトリにも、同じ 404 を返します。Forgejo と Gitea のソースでは、API はまずリポジトリを探し、次に権限を確かめ、権限がまったく無ければ、無いときとまったく同じに「not found」と答えます。つまり非公開のリポジトリは、トークンなしで読むと、またはトークンのアカウントに権限が無いと、存在しないリポジトリに見えます。まずトークン、次に住所を確かめます。
サーバーごとの文言
2026年10月24日に問い合わせた答えです。Codeberg(Forgejo 16)と code.forgejo.org(Forgejo 17)で、リポジトリが無いとき(ソースによれば、見る権限が無いときも同じ):
HTTP/1.1 404 Not Found
{"message":"The target couldn't be found.","url":"https://codeberg.org/api/swagger","errors":[]}
和訳:「対象が見つかりませんでした」。同じサーバーで、持ち主(住所のユーザーか組織)すら存在しないとき:
{"message":"GetUserByName","url":"https://codeberg.org/api/swagger","errors":["user redirect does not exist [name: no-such-owner]"]}
和訳:「ユーザーの転送先がありません」。gitea.com では、どちらのときも:
{"message":"not found","url":"https://gitea.com/api/swagger"}
自社のサーバーでは、版によって文言が違うことがあります。404 であることは同じです。トークンでリポジトリを確かめるには:
curl -i -H "Authorization: token your-token" https://codeberg.org/api/v1/repos/OWNER/REPO
200 でリポジトリが返れば、そのトークンで見えています。codeberg.org の代わりに自社のサーバーの住所を使います。
リポジトリはあるとき
- トークンを送っていない。トークンなしで読めるのは公開リポジトリだけです。
- トークンのアカウントに権限が無い。アカウントにリポジトリへの権限が要ります。たとえば共同作業者として、または組織のチームを通して。トークンがアカウント以上の権限を持つことはありません。
- トークンにリポジトリのスコープが無い。このときは 404 でなく 403 で断られます:「token does not have at least one of required scope(s)」。
住所が違うとき
API の住所は /api/v1/repos/持ち主/リポジトリ名 で、持ち主とリポジトリ名はクローンの住所のとおりです。Forgejo の GetUserByName の答えは、持ち主の部分からしてこのサーバーに無い、という意味です。ユーザーか組織の打ち間違いか、リポジトリが別のサーバーにあるかです。
名前を変えた・移したリポジトリ
Forgejo と Gitea のソースより:その名前のリポジトリが無いとき、サーバーは名前の変更で残った転送先を探します。
- 名前を変えたリポジトリ、または別の持ち主へ移したリポジトリ:古い住所は、どんな呼び出しにも 301 Moved Permanently で答え、
Locationに新しい住所を入れます。 - 名前を変えたユーザーか組織:古い名前は 307 Temporary Redirect で新しい名前へ転送します。
転送をたどる道具なら古い住所でもリポジトリを読めるので、古い住所のクローンでも動いているように見えます。何かを変える呼び出しは、道具が新しい住所へ送り直さない限り、301 が返るだけです。クローンを新しい住所へ向けます:
git remote set-url origin https://codeberg.org/NEW-OWNER/NEW-NAME.git
IntelliJ IDEA で Forgejo・Gitea のプルリクを見るなら
Lesstep の Pull Request Inbox for Forgejo and Gitea は、JetBrains IDE(2024.1 以降)のプラグインです。Codeberg 用と自社のサーバー用にトークンを1つずつ持ち、どちらも IDE のパスワード保管庫に入れて、それぞれのサーバーにだけ送ります。トークンなしでは公開リポジトリを読みます。サーバーがリポジトリに 404 で答えたときは、トークンが無ければ、リポジトリが非公開か存在しないと言ってトークンの設定を開けるようにし、トークンがあれば、そのトークンで開けるリポジトリがその住所に無いと言って、住所とアカウントの権限を確かめるよう案内します。名前を変えた・移したリポジトリを古い住所のクローンで開いたときは、サーバーの転送をたどって新しい住所を使います。読むときはもちろん、1.0.13 からは承認・コメント・マージのときも同じです。転送をたどるのは同じサーバーの中だけです(トークンが別のホストへ行くことはありません)。読むのは無料、承認・コメント・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
このページは Forgejo プロジェクト・Codeberg e.V.・Gitea プロジェクト・JetBrains のいずれとも提携しておらず、推奨・承認も受けていません。Forgejo・Gitea・Codeberg はそれぞれの持ち主の名前、IntelliJ IDEA は JetBrains s.r.o. の商標です。
ほかに:401「token is required」と知らないトークン · 「token does not have at least one of required scope(s)」 · Forgejo・Gitea のマージの断り(405・409) · Forgejo・Gitea のレビューの断り(422) · Forgejo・Gitea のブランチの更新の断り(403・409・422) · Forgejo・Gitea のプルリクが作れない(409・422・403) · Forgejo・Gitea のコメントの断り(403・422・400) · Forgejo・Gitea の検索の断り(400・422) · Forgejo・Gitea のプルリクの変更ファイル(50件ずつ・changed_files) · JetBrains の IDE で Forgejo・Gitea のプルリクを扱う · English