Bitbucket Pipelines:パイプラインからの push が「Permission denied to update branch」
リポジトリへ push し返すステップ(版を上げる・変更履歴を書く・タグを打つ)が、ここで止まります:
+ git push origin HEAD:master remote: Permission denied to update branch master. ! [remote rejected] HEAD -> master (pre-receive hook declined) error: failed to push some refs to ...
ブランチにブランチ制限があり、この push の書き込みを許していません(Atlassian の記事 Pipelines error: remote rejected HEAD -> master (pre-receive hook declined))。
ある人では通り、別の人では失敗する理由
Pipelines は取ってきた中身の HTTP の origin を用意しているので、資格情報なしの git push がそのまま通ります(Push back to your repository)。このエラーの Atlassian の記事によると、その push は「パイプラインを始めた人」で確かめられます。始め方は、コミットの push・プルリクエストを開く・手で実行する、のどれでも同じです。その人がブランチ制限でそのブランチに書き込めれば通り、書き込めない同僚が同じパイプラインを始めると失敗します。
Pipelines そのものを制限に足すことはできません。その要望が BCLOUD-19136「Expose bitbucket-pipelines user in Bitbucket branch permissions」で、2019年7月から開いたまま、258票・状態は Reviewing です。
2026年9月15日から:リポジトリのアクセストークンで push する
Bitbucket の変更履歴(2026年9月15日):ブランチ制限の Write access と Merge access に、リポジトリ・プロジェクト・ワークスペースのアクセストークンを足せるようになりました。要望の BCLOUD-22400(427票)は同じ日に「直った」で閉じています。Atlassian の記事 Unable to push to repository - "pre-receive hook declined" error は最後の更新が2025年9月で、まだ「アクセストークンには対応していない」と書いています。
- そのリポジトリで:Repository settings、Security の Access tokens、Create access token。権限は Repositories: Write。リポジトリのトークンが届くのは、そのリポジトリだけです。トークンは1回しか表示されません。
- Repository settings、Branch restrictions:そのブランチの規則を編集し、Write access にトークンを足します。
- Repository settings、Pipelines の Repository variables:変数
PUSH_URLを Secured で作り、トークン入りの住所を入れます。ユーザー名はx-token-authです(Using access tokens):https://x-token-auth:<トークン>@bitbucket.org/<ワークスペース>/<リポジトリ>.git - ステップのスクリプトで:
script:
- git remote set-url origin "$PUSH_URL"
- git commit -am "[skip ci] Release ${BITBUCKET_BUILD_NUMBER}"
- git push origin HEAD:master
これで push は、誰がパイプラインを始めたかに左右されず、ボット用のアカウントも要りません。メッセージの [skip ci] は、新しいコミットがまたパイプラインを始めないためです。終わらない繰り返しを防ぐために、Atlassian の push し返しの記事が勧めています。
前からのやり方:人の SSH 鍵か API トークン
Atlassian の push し返しの記事は、制限の一覧にいる人として push させます:
- Pipelines が管理する SSH の鍵の組:Repository settings、Pipelines の SSH Keys、Generate keys。公開鍵をその人の Personal Bitbucket settings の SSH Keys に足し、スクリプトで
git remote set-url origin ${BITBUCKET_GIT_SSH_ORIGIN}。 - その人の API トークン(スコープは
read:repository:bitbucketとwrite:repository:bitbucket)を secured の変数に入れ、Bitbucket のユーザー名と一緒に remote の住所に入れる。 - OAuth のコンシューマーの資格情報では、ブランチ制限のあるブランチへ push できません。
記事は、アカウントに設定した資格情報は、届くリポジトリを絞れないと注意しています。このエラーの Atlassian の記事も、個人の鍵を使うのは勧めないと書いています。人の SSH 鍵ではなくワークスペースに足した鍵も断られるので、その人の設定へ移します(「pre-receive hook declined」の記事)。
同じ拒否が出るほかの理由
- force push やリベース:規則で Allow rewriting branch history も許す必要があります。
- 署名つきのコミットが必須(Premium):Repository details の Advanced で Require all commits to have a verified signature が入っていると、パイプラインが署名なしで作ったコミットは拒否されます。
IntelliJ IDEA で失敗した push を見る
Pipeline Inbox for Bitbucket Pipelines は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Bitbucket Cloud の全部のリポジトリのパイプラインを IDE のツールウィンドウに並べ、失敗したパイプラインでは、ステップが失敗したコマンドとその最後の数行(たとえば git push と Bitbucket の「Permission denied to update branch」)を見せます。制限を直しただけなら、push する新しいコミットがありません。Pro なら Run again で、同じコミットを IDE からもう一度ビルドできます。一覧・ステップ・ログは無料。実行・やり直し・停止は Pro(月 US$1.50・30日の無料試用つき)。画面は日本語です。
Atlassian・Bitbucket・Bitbucket Pipelines は Atlassian の商標、Git は Software Freedom Conservancy の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページはそのいずれとも提携しておらず、承認も受けていません。
ほかに:自分の PC からの push が「pre-receive hook declined」 · git のサブモジュールを取ってこない · 「We couldn't clone the repository」 · push したのにパイプラインが動かない · 失敗したパイプラインをもう一度実行する · SSH は ssh.bitbucket.org へ · 「You have reached your pull rate limit」(Docker Hub) · 「There is an error in your bitbucket-pipelines.yml」 · 「This pipeline was paused」(デプロイ) · IntelliJ IDEA の Bitbucket Pipelines 用プラグインの比較 · English