Forgejo・Gitea がプルリクを作らなかった理由
API でプルリクを作ると(POST /api/v1/repos/持ち主/リポジトリ名/pulls に head・base・title)、409・422・404・403 で断られることがあります。以下はすべて両方のソース(routers/api/v1/repo/pull.go の CreatePullRequest と parseCompareInfo、services/pull/pull.go の NewPullRequest)を 2026年10月24日に読んで確かめたものです。
答えの意味
- 409
pull request already exists for these targets [id: 123, issue_id: 7, head_repo_id: 1, base_repo_id: 1, head_branch: feature, base_branch: main](和訳:この組み合わせのプルリクはもうあります):同じリポジトリの同じブランチから同じ base のブランチへのプルリクが、まだ開いています。名前に反してissue_idがそのプルリクの番号です(ここでは #7)。idは内部の ID です。閉じたものやマージ済みのものは数に入りません。同じブランチから別の base のブランチへなら作れます。 - 422
Invalid PullRequest: There are no changes between the head and the base(和訳:head と base の間に変更がありません):headとbaseが同じです。ソースでは、書いた2つの名前を比べているだけです。 - 422
Invalid PullRequest: base and head must be branches(Gitea。和訳:base と head はブランチでなければなりません):どちらかがタグかコミットです。 - 404
The target couldn't be found.(和訳:対象が見つかりません):ブランチがサーバーにありません。たいていはまだ push していません。Forgejo はerrorsに理由を添えます(たとえばcould not find 'feature' to be a commit, branch or tag in the head repository OWNER/REPO)。Gitea は何も添えません。フォークからのプルリクではheadを持ち主:ブランチと書き、Forgejo はそれが違うとthe owner … does not exist(持ち主がいません)や、その持ち主がリポジトリのdoes not have a fork of(フォークを持っていません)と言います。 - 403
user must be a collaborator(Gitea。和訳:共同作業者でなければなりません):あなたはそのリポジトリの共同作業者でも、コードを見られる組織のメンバーでもなく、ブランチがあるリポジトリに書き込むこともできません。Forgejo のソースには、この検査はありません。 - 403:リポジトリの持ち主があなたをブロックしているとき(両方)。
リポジトリへの書き込みの権限が無いトークンも 403 で断られますが、そのときの答えには token does not have at least one of required scope(s) と書いてあります。足す権限の見つけ方へ。無いリポジトリや見えないリポジトリも 404 です。無いのか・非公開か・名前が変わったかへ。
いまどうなっているか
curl -H "Authorization: token your-token" https://codeberg.org/api/v1/repos/OWNER/REPO/pulls/main/feature
feature から main へのプルリクを1つ返します。一度も無ければ 404 です。ソースでは開いているものだけを選ばないので、state と number を見てください。開いているものが、409 の言うプルリクです。サーバーにブランチがあるかは、…/repos/OWNER/REPO/branches/feature が無ければ 404 で答えます。codeberg.org はあなたのサーバーの住所に置き換えてください。
直し方
- 409:
issue_idの番号のプルリクを開いて、そこで続ける。ブランチに push すればそのプルリクが更新されます。新しく作りたいなら、先に古い方を閉じるか、別の base のブランチを選ぶ。 - 422「no changes」:別の base のブランチ(たいていは既定のブランチ)を選ぶ。
- 404:ブランチを push してから(
git push -u origin feature)作る。フォークからなら head を持ち主:ブランチと書く。 - 403「user must be a collaborator」:共同作業者に加えてもらうか、リポジトリをフォークして、フォークからプルリクを作る。
IntelliJ IDEA で Forgejo・Gitea のプルリクを見るなら
Lesstep の Pull Request Inbox for Forgejo and Gitea は、JetBrains IDE(2024.1 以降)のプラグインです。いまいるブランチからプルリクを作ります。サーバーにまだそのブランチが無いときは先に push するよう勧め、同じブランチを対象には受け付けず、サーバーが 409 で答えたときは、このブランチのプルリクがもう開いていると、サーバーの文を添えて伝えます。403 なら、サーバーの文を添えて、リポジトリでの権限かブランチの保護があなたのアカウントに許していない可能性がある、と。ほかの断りはサーバーの文で伝えます。読むのは無料、作成・承認・コメント・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
このページは Forgejo プロジェクト・Codeberg e.V.・Gitea プロジェクト・JetBrains のいずれとも提携しておらず、推奨・承認も受けていません。Forgejo・Gitea・Codeberg はそれぞれの持ち主の名前、IntelliJ IDEA は JetBrains s.r.o. の商標です。
ほかに:Forgejo・Gitea のマージの断り(405・409) · Forgejo・Gitea のレビューの断り(422) · Forgejo・Gitea のブランチの更新の断り(403・409・422) · 「token does not have at least one of required scope(s)」 · 401「token is required」と知らないトークン · 404「The target couldn't be found.」と「not found」 · Forgejo・Gitea のコメントの断り(403・422・400) · Forgejo・Gitea の検索の断り(400・422) · Forgejo・Gitea のプルリクの変更ファイル(50件ずつ・changed_files) · JetBrains の IDE で Forgejo・Gitea のプルリクを扱う · English