Forgejo・Gitea がブランチの更新を断った理由
「ブランチの更新」(POST /api/v1/repos/持ち主/リポジトリ名/pulls/番号/update。そのままならマージで、?style=rebase を付けるとリベースで)は、対象のブランチの新しいコミットをプルリクのブランチに取り込みます。以下はすべて両方のソース(routers/api/v1/repo/pull.go の UpdatePullRequest と services/pull/update.go)を 2026年10月24日に読んで確かめたものです。変わった Gitea の版も見ています。
答えの意味
- 文がまったく無い 403:あなたのアカウントは、このやり方ではこのブランチを更新できません(下を見てください)。本文が空なので、どの決まりで断られたかは書いてありません。
merge failed because of conflict・rebase failed because of conflict(409。和訳:競合のためマージ/リベースに失敗しました):対象のブランチの新しいコミットが、プルリクのコミットと競合しています。ブランチは変わっていません。- 閉じたかマージ済みのプルリクの 422:Gitea 1.27 以降は
pull request is already closed・pull request is already merged(和訳:プルリクはもう閉じています/マージ済みです)と言います。Forgejo と 1.26 までの Gitea は、同じ 422 を%!s(<nil>)という文で返します。ソースでは答えに渡す誤りが空なので、この文は Go が「何も無い」ときに出す印で、手がかりではありません。 - もう最新のとき(対象のブランチのコミットがもう入っている):Forgejo は 200 で答えて何も変えません。Gitea は 500 で答え、本番の動かし方のサーバーでは、管理者でなければ文は空です。管理者には
HeadBranch of PR 42 is up to date(和訳:プルリク 42 のブランチは最新です)と見えます。
読むだけのトークンも 403 で断られますが、そのときの答えには token does not have at least one of required scope(s) と書いてあります。足す権限の見つけ方へ。無いプルリクの番号は 404 です。無いのか・非公開か・名前が変わったかへ。
誰が、どのやり方で更新できるか
マージで(そのままのとき)は、次のどちらかに当てはまれば更新できます:
- プルリクのブランチに push できる。そのブランチがあるリポジトリ(フォークのことが多い)に書き込めて、そのブランチに保護のルールがあれば、その範囲で。
- 作成者が Allow edits from maintainers(メンテナーによる編集を許す)を入れたままで、あなたが対象のリポジトリでマージできる。
Gitea 1.27 以降は、対象のリポジトリの設定 Enable updating pull request branch by merge(マージによるプルリクのブランチの更新を許す)も要ります。
リベースでは、次のときに断られます:
- 対象のリポジトリの設定 Enable updating pull request branch by rebase(リベースによるプルリクのブランチの更新を許す)が入っていない。
- Forgejo と 1.22 までの Gitea で、プルリクのブランチに保護のルールがある(リベースには強制 push が要るため)。
- Gitea 1.23 以降で、そのブランチに強制 push できない。
AGit で作ったプルリク(ブランチからでなく refs/for/… に push して作ったもの)は、この方法では更新できません。403 です。
いまどうなっているか
curl -H "Authorization: token your-token" https://codeberg.org/api/v1/repos/OWNER/REPO/pulls/42
merge_base が base.sha と違えば、対象のブランチに、プルリクのブランチに無いコミットがあります。allow_maintainer_edit は、作成者がメンテナーによる編集を許しているかです。codeberg.org はあなたのサーバーの住所に置き換えてください。
直し方
- 409 の競合:手元のクローンで、対象のブランチをプルリクのブランチにマージかリベースし、競合を解いて push する。
- 403:作成者にメンテナーによる編集を許してもらうか、そのブランチに push できる人に頼む。リベースだけが断られるなら、マージで更新する。
- 422:更新する。プルリクはもう閉じているか、マージ済みです。
- ほかの人が更新した直後の Gitea の 500:プルリクを読み直す。
merge_baseがbase.shaと同じなら、もう更新するものはありません。
IntelliJ IDEA で Forgejo・Gitea のプルリクを見るなら
Lesstep の Pull Request Inbox for Forgejo and Gitea は、JetBrains IDE(2024.1 以降)のプラグインです。対象のブランチに新しいコミットがあると、プルリクのマージの条件の中でそう示し、マージでブランチを更新するリンクを出します。サーバーが断ったときは、そう言います。403 なら、リポジトリでの権限かブランチの保護があなたのアカウントに許していない可能性がある、と。競合ならサーバーの文で伝えます。1.0.15 からは、そのあいだにプルリクが閉じたかマージされたときは「%!s(<nil>)」の代わりにそう言い、Gitea でもう取り込むものが無いときは、ブランチにもう対象のブランチの新しいコミットが入っていると言います。読むのは無料、承認・コメント・マージは 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 のチェックが合格したらマージの断り(405・409・500) · Forgejo・Gitea のレビューの断り(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 のプルリクが作れない(409・422・403) · Forgejo・Gitea のコメントの断り(403・422・400) · Forgejo・Gitea の検索の断り(400・422) · Forgejo・Gitea のプルリクの変更ファイル(50件ずつ・changed_files) · JetBrains の IDE で Forgejo・Gitea のプルリクを扱う · English