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作成は普通に失敗します。
git と gh は別のものを見る
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に刻まれるAuthorgit 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だけ失敗する」系の違和感を早く潰せるようになります。