Bitbucket:「Repository access denied. access via a deployment key is read-only.」
Bitbucket Cloud には SSH の鍵を置くところが2つあります。アカウントの SSH キーに置いた鍵は自分として動き、自分の権限を持ちます。リポジトリのアクセス キー(以前の名前はデプロイ キー)に置いた鍵は、そのリポジトリ1つへの読み取り専用のアクセスです(アクセス キーについての Atlassian のページ)。クローンと取得はできますが、git push はこのメッセージで止まります。直すのはリポジトリの権限ではなく、ssh がどの鍵を出すか、その鍵をどこに登録したかです(Stack Overflow の質問は17万回以上見られています)。
git push が断られている間も:JetBrains IDE のプラグイン Pull Request Inbox for Bitbucket は、SSH ではなく Bitbucket の REST API と Atlassian のメールアドレスと API トークンで話すので、レビューの受信箱・差分・議論は動きます。JetBrains Marketplace で入れる
どう見えるか
repository access denied. access via a deployment key is read-only.のあとにfatal: Could not read from remote repository.- 出るのは push のときや、タグの push・ブランチの削除のような書き込みのときです。同じ鍵でもクローン・取得・pull は動くので、あとになって気づくことがよくあります。
ssh がどの鍵を使ったかを見る
ssh -vT git@bitbucket.org(リモートがssh.bitbucket.orgならそちら)で、ssh が出した鍵のファイルと、サーバーが受け取った鍵が出ます。ssh-add -lはエージェントが持っている鍵の一覧です。エージェントの鍵は、指定したつもりのファイルより先に試されます。- 受け取られた鍵がリポジトリのアクセス キーにあるなら、それが原因です。ある回答は
ssh-add -Dでエージェントを空にし、正しい鍵だけをssh-addで足して、ssh -vTでもう一度確かめています。
鍵をアカウントへ移す
- Bitbucket の Personal Bitbucket settings を開き、SSH keys に公開鍵を足します(採用された回答)。同じ鍵を使うなら、別の回答のように、先にリポジトリのアクセス キーから外してからアカウントに足します。
- そのアクセス キーが、読むだけのサーバー(デプロイ先など)のためにあるなら残しておき、自分のマシンにはアカウントに置く別の鍵を用意します。1台に鍵が複数あるときは、
~/.ssh/configに鍵ごとのHostを作り、IdentityFileとIdentitiesOnly yesを書けば、ssh が違う鍵を出さなくなります(1台で複数の鍵を使うことについての Atlassian のページ)。
Bitbucket Pipelines から push する
- パイプラインの既定の origin は HTTP で、Atlassian はそのままで push できると書いています(リポジトリへ push し戻すことについての Atlassian のページ)。このメッセージが出るのは、スクリプトが origin を SSH に切り替え(たとえば
${BITBUCKET_GIT_SSH_ORIGIN})、使う鍵がアクセス キーでしかないときです。 - SSH を使うなら、Atlassian の手順のとおり、リポジトリの Pipelines の SSH keys で鍵を作り、その公開鍵を Personal Bitbucket settings の SSH keys に足します。または、
write:repository:bitbucketのスコープを持つ API トークンで HTTPS から push します。コミットのメッセージには[skip ci]を入れ、その push でパイプラインがまた動かないようにします。
ほかの CI のサーバーから push する
- Jenkins のようなサーバーにはアクセス キーを渡すことが多く、チェックアウトにはそれで正しいのですが、タグやバージョンの更新を push し戻すには足りません。書き込めるものをジョブに渡します。ビルド用の Bitbucket のアカウントに置いた SSH の鍵か、HTTPS で書き込みの権限を持つアクセス トークンです。
IntelliJ IDEA で Bitbucket のプルリクエスト
Pull Request Inbox for Bitbucket は、JetBrains IDE 2024.1 以降で動く Lesstep のプラグインです。ワークスペースとリポジトリを git のリモート(SSH でも HTTPS でも、ssh.bitbucket.org も)から読み、Bitbucket の REST API と Atlassian のメールアドレスと API トークンで話します。SSH は使いません。なので git の SSH が失敗している間も、レビューの受信箱・差分・議論は動きます。ここまでは無料。承認・コメント・マージは Pro(月 US$1.50・30日の無料試用つき)。
Bitbucket と Atlassian は Atlassian の商標、IntelliJ IDEA は JetBrains s.r.o. の商標、Jenkins は LF Charities Inc. の商標です。このページはそのいずれとも提携しておらず、承認も受けていません。
ほかに:「Permission denied (publickey)」 · 「You may not have access to this repository」 · Bitbucket Cloud の SSH は ssh.bitbucket.org へ · English