Git の Author も合っている。SSH の接続先も合っている。なのに gh pr create でPRを作ろうとしたら、なぜか対象のリポジトリを見つけられない、あるいは権限がないと言われる。

このパターン、最初は少し混乱しました。git config user.email も見ているし、remote URL もGitHubに向いている。だからGitまわりの設定は合っているように見えます。

ただ、ここで見落としやすいのが GitHub CLIのactive account です。git のAuthor、SSHの鍵、gh の認証は別レイヤーです。Gitの設定が合っていても、gh が別アカウントを向いていれば、PR作成は普通に失敗します。

gitgh は別のものを見る

Author が合っていてもPR作成権限は別

まず、commitに残るAuthorはGitの設定です。

git config --get user.name
git config --get user.email

ここで期待した名前やメールアドレスが返ってきても、それは「commitに誰として記録されるか」の確認です。GitHub CLIがどのGitHubアカウントとしてAPIを叩くかは、これとは別です。

たとえば、1台のMacで仕事用と個人用のGitHubアカウントを使い分けているとします。git includeIf でAuthorを分け、SSH aliasで鍵も分けていたとしても、gh のactive accountだけ別のまま残ることがあります。

Git Author: personal-account
SSH key:    personal-account
gh active:  work-account

この状態で個人リポジトリにPRを作ろうとすると、GitHub CLIは work-account としてGitHub APIを叩きます。personal-account のリポジトリに対する権限がなければ、PR作成に失敗します。

remote URL が合っていても安心しきれない

remote URLも確認したくなります。

git remote -v

これは大事です。ただし、remote URLが合っていることと、gh のAPI認証アカウントが合っていることは別です。

SSHでpushできるのに、gh pr create だけ失敗するなら、gh のactive accountを疑う価値があります。

まず gh auth status を見る

active accountを確認する

GitHub CLIの状態は gh auth status で確認できます。

gh auth status

複数アカウントを登録している場合、hostごとにどのアカウントがactiveかが表示されます。見るべきポイントは、対象リポジトリのownerと、gh のactive accountが噛み合っているかです。

必要なら、active accountだけに絞って確認できます。

gh auth status --active --hostname github.com

ここで想定と違うアカウントが出ていたら、GitやSSHではなくGitHub CLIの認証コンテキストがズレています。

tokenは表示しない

gh auth status にはtokenを表示するオプションもありますが、普段の切り分けでは不要です。

# 普段の確認では使わない
gh auth status --show-token

tokenはログやスクリーンショットに残すと危ないので、アカウント名とactive状態だけ見れば十分です。記事やissueに貼るときも、tokenやraw outputは貼らず、必要な事実だけに丸めます。

違っていたら gh auth switch で切り替える

hostとuserを指定する

active accountが違っていたら、gh auth switch で切り替えます。

gh auth switch --hostname github.com --user personal-account

--user を付けると、対話プロンプトに入らず明示的に切り替えられます。複数アカウントを使っているなら、手順に書くときはこの形のほうが読みやすいです。

切り替えたら、もう一度確認します。

gh auth status --active --hostname github.com

期待したアカウントがactiveになっていれば、gh pr create を再実行します。

gh pr create --base main --head feature/example

自動化では環境変数を分ける

CIやスクリプトでGitHub CLIを使う場合は、active accountの切り替えではなく、実行時に使うtokenやrepoを明示することもあります。

GH_REPO=owner/repo gh pr view 123

ただし、tokenそのものをコマンド履歴や記事に残さないようにします。ローカルで手作業するなら gh auth switch、自動化するならsecret storeやCI secretsから渡す、という分け方が安全です。

自分用の確認順

3つを別々に見る

今回の学びは、GitHubまわりの状態を1つにまとめて見ないことでした。

# 1. commit Author
git config --get user.email

# 2. push先
git remote -v

# 3. GitHub CLIのactive account
gh auth status --active --hostname github.com

この3つは似ているようで、見ているものが違います。

  • git config user.email はcommitに刻まれるAuthor
  • git remote -v はpush / fetchする接続先
  • gh auth status はGitHub APIを叩くアカウント

PR作成で詰まったとき、Authorとremoteだけ見て「合っているはず」と思うと遠回りします。gh でPRを作るなら、gh のactive accountも見る。これだけで切り分けがかなり早くなります。

PR作成前の小さいチェックにする

複数GitHubアカウントを使っているなら、PR作成前にこの3行を打つだけでも安心できます。

git config --get user.email
git remote -v
gh auth status --active --hostname github.com

毎回やるのは少し面倒ですが、アカウントをまたいで作業した直後や、private repoでPRを作る前には効きます。

SSH aliasとgit includeIfでGit側を整えても、GitHub CLIはまた別の箱です。ここを分けて見ると、「Gitは合っているのにghだけ失敗する」系の違和感を早く潰せるようになります。

関連