はじめに
Docker コンテナの中で開発していると、コンテナ内から Bitbucket のリポジトリへ git push したくなります。
ところが 2026年6月9日に Bitbucket の App password が完全廃止され、従来よく紹介されていた「App password を発行してパスワード欄に入れる」という手順が使えなくなりました。現在は後継の API トークン を使います。
この記事では、Linux コンテナ内から Bitbucket へ push し、プルリクエストを作るところまでの手順をまとめます。
問題
1. App password が使えない
Bitbucket は通常のログインパスワードでの HTTPS 認証を受け付けません。長らくその代替は App password でしたが、これは 2026年6月9日をもって完全に停止しました。今から発行することはできません。
2. clone した URL にユーザー名が埋め込まれている
Bitbucket の Web UI から「Clone」でコピーした URL には、ログイン中アカウントのユーザー名が自動で埋め込まれています。
$ git remote -v
origin https://example-user@bitbucket.org/example-workspace/example-repo.git (fetch)
origin https://example-user@bitbucket.org/example-workspace/example-repo.git (push)
この状態で git pull すると、ユーザー名を聞かれずパスワードだけを求められます。
$ git pull
Password for 'https://example-user@bitbucket.org':
API トークンはこのユーザー名の組み合わせでは認証できないため、ここで何を入れても弾かれます。
解決方法
Step 1: API トークンを発行する
API トークンは Atlassian アカウント側の画面から発行します。Bitbucket の App passwords 画面には「Go to API tokens」というリンクがあり、そこからも遷移できます。
- https://id.atlassian.com/manage-profile/security/api-tokens を開く
- Create API token with scopes をクリック
- 名前と有効期限を入力して Next
- 対象アプリに Bitbucket を選んで Next
- スコープを選択して作成
- 表示されたトークンをコピーする(再表示できないので必ず控える)
選ぶスコープ
スコープは 動作:リソース:プロダクト の3段構成になっています。
| スコープ | 意味 | 用途 |
|---|---|---|
read:repository:bitbucket |
リポジトリの読み取り | clone / fetch / pull |
write:repository:bitbucket |
リポジトリへの書き込み | push |
write:pullrequest:bitbucket |
プルリクエストの作成・更新・マージ | API 経由で PR を作る場合 |
git コマンドで push するだけなら repository 系だけで足ります。write は read を自動的に含まないので、両方にチェックが入っているか確認してください(UI 上は write を選ぶと read が自動で付くこともあります)。
pullrequest スコープが要るのは、CLI やスクリプトから API でプルリクエストを操作する場合だけです。ブラウザで PR を作るならログインセッションで操作するので不要です。
Step 2: remote URL を書き換える
埋め込まれている個人のユーザー名を、API トークン認証用の固定ユーザー名 x-bitbucket-api-token-auth に置き換えます。
git remote set-url origin https://x-bitbucket-api-token-auth@bitbucket.org/example-workspace/example-repo.git
URL の構造は次のとおりです。
https://ユーザー名@ドメイン/ワークスペース/リポジトリ名.git
3つ目は「プロジェクト名」ではなく ワークスペース名 です。Bitbucket のワークスペースはリポジトリをまとめる組織・アカウント単位の入れ物で、GitHub でいうオーナー(組織名/ユーザー名)に相当します。Bitbucket には別に「プロジェクト」という分類機能もありますが、こちらは URL には現れません。
なぜユーザー名が固定値でよいのか
URL の ユーザー名@ は、リポジトリの場所を特定するためのものではありません。HTTP Basic 認証(ユーザー名とパスワードをまとめて送る標準的な認証方式)のユーザー名欄を、あらかじめ埋めておくための指定です。リポジトリの特定に使われるのはドメイン以降だけです。
そして API トークンでは「誰として認証するか」「どの権限を持つか」という情報をトークン自体が持っています。そのためユーザー名欄は識別に使われず、Bitbucket 側が x-bitbucket-api-token-auth という固定文字列を受け付ける仕様になっています。
なお、Atlassian アカウントのメールアドレスを使うこともできますが、@ を含むため URL エンコード(%40)が必要になります。固定ユーザー名のほうが確実です。
Step 3: 認証情報を保存する
毎回トークンを打ち込むのは現実的ではないので、保存用のヘルパーを有効にします。
git config --global credential.helper store
その後 git pull や git push を実行すると、パスワードを聞かれます。
$ git pull
Password for 'https://x-bitbucket-api-token-auth@bitbucket.org':
ここに API トークン を貼り付けて Enter を押します。入力中は何も表示されませんが、入力自体は通っています。ターミナルへの貼り付けは Ctrl+Shift+V(環境によっては右クリック)です。
認証が通ると ~/.git-credentials に保存され、次回以降は聞かれなくなります。
注意:
storeはトークンを平文で保存します。コンテナのホームディレクトリを名前付きボリュームにしている場合、コンテナを作り直しても残る代わりに、そのボリュームを他人と共有すると漏洩します。共有しない前提で使ってください。
Step 4: コミット者情報を設定する
コンテナを作り直すと消えることが多いので、併せて設定しておきます。
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
Step 5: push する
git switch -c feature/my-change
git add .
git commit -m "Add my change"
git push -u origin feature/my-change
Step 6: プルリクエストを作る
ブラウザで作る場合
push すると Bitbucket 側にブランチが現れるので、Web UI から「Create pull request」を押すだけです。この操作は通常のログインセッションで行われるため、トークンのスコープは関係ありません。
コンテナ内から API で作る場合
write:pullrequest:bitbucket スコープを付けたトークンが必要です。Bearer 認証で REST API を叩きます。
export BITBUCKET_API_TOKEN="発行したトークン"
curl -X POST \
-H "Authorization: Bearer ${BITBUCKET_API_TOKEN}" \
-H "Content-Type: application/json" \
https://api.bitbucket.org/2.0/repositories/example-workspace/example-repo/pullrequests \
-d '{
"title": "Add my change",
"source": { "branch": { "name": "feature/my-change" } },
"destination": { "branch": { "name": "main" } }
}'
Bearer 認証を使うと、トークンに紐づく Atlassian のメールアドレスを渡す必要がなくなります。
補足: プロキシ配下のコンテナの場合
社内プロキシを経由する構成では、コンテナに HTTP_PROXY / HTTPS_PROXY が設定されていれば git はそれをそのまま使うため、git 側に追加設定は不要です。
environment:
- HTTP_PROXY=http://px:3128
- HTTPS_PROXY=http://px:3128
- http_proxy=http://px:3128
- https_proxy=http://px:3128
外部ネットワークに直接つながらない internal: true なネットワークにコンテナを置いている場合も、プロキシ経由で HTTPS が通れば push できます。逆にこうした構成では SSH(22番ポート)が塞がれていることが多いので、HTTPS + API トークンのほうが現実的です。
おわりに
ポイントは3つです。
- App password は廃止済み。今は API トークン
- clone 時に埋め込まれた個人のユーザー名を
x-bitbucket-api-token-authに置き換える - スコープは
read/writeを明示的に両方選ぶ
古い記事の手順をそのままなぞると App password 発行画面で行き止まりになるので、同じところで詰まった方の参考になれば幸いです。
参考
- API tokens | Bitbucket Cloud | Atlassian Support
- Using API tokens | Bitbucket Cloud | Atlassian Support
JISOUのメンバー募集中!
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか?
興味のある方は、ぜひホームページをのぞいてみてください!
▼▼▼
https://projisou.jp
