Forgejo・Gitea がマージを断った理由
API でのマージ(POST /api/v1/repos/持ち主/リポジトリ名/pulls/番号/merge)が失敗すると、Forgejo と Gitea は 405 か 409 で答え、JSON の message に理由を書きます。両方のソース(routers/api/v1/repo/pull.go の MergePullRequest と、services/pull の確認)より:405 はマージを始める前に確認のどれかで止まった、409 はサーバーがマージを試みて失敗したか、見た後にブランチが動いた、です。下の文言は両方の今のソースのものです。古いサーバーでは文言が違うことがあります。
405:確認で止まった
確認はこの順に行われ、最初に引っかかったもので答えます:
- もうマージ済み:Gitea は
The PR is already merged(和訳:もうマージ済みです)、Forgejo は空の文で答えます。閉じたプルリクは 405 でなく 404 です。 User not allowed to merge PR(和訳:このユーザーはマージできません):アカウントが対象のブランチへマージできません。書き込みの権限が要り、ブランチの保護のルールでマージできる人がさらに絞られていることがあります。Work in progress PRs cannot be merged(和訳:作業中のプルリクはマージできません):タイトルが作業中の印(既定ではWIP:か[WIP])で始まっています。外すと準備完了になります。Please try again later(和訳:後でもう一度試してください):サーバーがプルリクをマージできる状態と判定していません。ソースでは、マージできる状態でなければいつもこの答えなので、競合しているときも 409 でなくこれになり、push の直後でサーバーがまだ確かめているときもこれです。- ブランチの保護(Forgejo は
not allowed to merge [reason: …]、Gitea は理由だけを書きます):Not all required status checks successful(必須のチェックが成功していない)・Does not have enough approvals(承認が足りない)・There are requested changes(変更を求められている)・There are official review requests(正式なレビューの依頼が残っている)・The head branch is behind the base branch(元のブランチが対象のブランチより遅れている)・Changed protected files(保護されたファイルを変えている)、Gitea ではさらにThere are missing code owner reviews(コードオーナーのレビューが足りない)。ルールが許していれば、管理者はforce_mergeでこれらを飛ばせます。 - 署名つきのコミット:対象のブランチが署名つきのコミットを求めていて、マージに署名が付かない。Gitea は、プルリクのコミットがすべて検証済みでないときも断ります。
- マージの方式:Forgejo は
squash is not an allowed merge style for this repository(和訳:squash はこのリポジトリで許されたマージの方式ではありません。Doで送った方式が入ります)と答えます。リポジトリの設定がその方式を許していません。
プルリクがいまどうなっているかは、読んで確かめます:
curl -H "Authorization: token your-token" https://codeberg.org/api/v1/repos/OWNER/REPO/pulls/42
mergeable は、サーバーが確かめている間・競合している間・その確認でエラーが出たあと・作業中の間は false です。codeberg.org の代わりに自社のサーバーの住所を使います。代わりに merge_when_checks_succeed を付けて頼むと、チェックが通ったときのマージを予約します(201)。この頼み方は、ブランチの保護の確認では止まりません。予約が待つものと、それでも断る答えはチェックが合格したらマージの断りへ。
409:マージを試みて失敗した
head out of date(和訳:先頭が古い):レビューした先頭をhead_commit_idで送ったが、ブランチの先頭が別のコミットになっている。見た後に誰かが push しました。- message が無く、
Style・StdOut・StdErrがある:マージの最中に(リベースの方式ならリベースの最中に)git が競合を見つけたか、ブランチどうしに共通の履歴がありません。確認の時点では、まだ見えていなかったものです。 merge push out of date(和訳:マージの push が古い):サーバーがマージしている間に、対象のブランチが動きました。PushRejected with remote message: …(和訳:push が断られました。リモートの文:…):サーバーのフックがマージの push を断りました。続きはフックの文です。- マージがもう予約されているのに
merge_when_checks_succeedで頼んだときも 409 です。
ほかの確認が通った後の、message が空の 500 は、プルリクエストがまだ開いている課題やプルリクエストに依存しているという意味です。サーバーはこの理由を管理者にしか見せません。その依存先を閉じるか、依存を外します(詳しく)。
直し方
- Please try again later:push の直後なら、数秒待ってもう一度マージする。
mergeableが false のままなら競合を解決する。手元のクローンで対象のブランチをマージかリベースして push します。 - ブランチの保護:理由が言うもの(承認・通ったチェック・レビュアーの新しいレビュー)をそろえる、遅れていればブランチを更新する、またはチェックが通ったときのマージを頼む。
- User not allowed to merge PR:マージできる人に頼むか、リポジトリの設定で対象のブランチの保護のルールを確かめる。
- head out of date:新しいコミットを見てから、新しい先頭でマージする。
- 競合(409)か merge push out of date:プルリクを読み直して競合を解決するか、そのままもう一度試す。
IntelliJ IDEA で Forgejo・Gitea のプルリクを見るなら
Lesstep の Pull Request Inbox for Forgejo and Gitea は、JetBrains IDE(2024.1 以降)のプラグインです。マージの前に、プルリクのマージの条件を、マージを止めているものから順に見せます。作業中か・ブランチが求める数に対する承認・変更の依頼・必須のチェック・競合・対象のブランチの新しいコミット・ブランチがあなたのアカウントにマージを許しているか、です。マージするのは、画面に出ていた先頭のコミットです。push の直後にサーバーが「Please try again later」と答えたときは、数秒のあいだ聞き直します。サーバーが断ったときは、そう言います。405 なら今はマージできないとサーバーの文を添えてマージの条件を見るように、409「head out of date」ならブランチが変わったので読み直すように、と。1.0.14 からは、ほかの 409 では、ブランチが競合しているか共通の履歴が無いこと、またはサーバーの文を伝えます。1.0.17 からは、文の無い 500 に、開いている依存先で止まっていると言います。チェックが通ったときのマージと、ブランチの更新もできます。読むのは無料、承認・コメント・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
このページは Forgejo プロジェクト・Codeberg e.V.・Gitea プロジェクト・JetBrains のいずれとも提携しておらず、推奨・承認も受けていません。Forgejo・Gitea・Codeberg はそれぞれの持ち主の名前、IntelliJ IDEA は JetBrains s.r.o. の商標です。
ほかに:Forgejo・Gitea のチェックが合格したらマージの断り(405・409・500) · Forgejo・Gitea の必須のチェック(不足・skipped・パターン) · 404「The target couldn't be found.」と「not found」 · 401「token is required」と知らないトークン · 「token does not have at least one of required scope(s)」 · 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