はじめに
仕事と個人、あるいは複数の組織で別々の GitHub アカウントを使っていると、「このプロジェクトでは A アカウント、あっちのプロジェクトでは B アカウント」というように、ディレクトリごとにアカウントを使い分けたくなります。
gh CLI には gh auth switch で手動切り替えする機能はありますが、プロジェクトを行き来するたびに切り替えるのは地味に面倒で、切り替え忘れて間違ったアカウントで操作してしまう事故も起きがちです。
この記事では、cd するだけでプロジェクトごとに gh のアカウントと git のコミット author が自動で切り替わる環境を、direnv を使って作る方法をまとめます。
やりたいことはシンプルにこの2つです。
-
~/projects/project-aにいるときはaccount-aでghと git を操作する - それ以外(他のプロジェクト)では普段使いの
account-mainを使う
よくあるハマりどころ:GH_TOKEN 環境変数
まず最初に確認しておきたいのが、gh の認証状態です。
gh auth status
このとき、出力に (GH_TOKEN) と表示されているアカウントがあったら要注意です。
github.com
✓ Logged in to github.com account account-main (GH_TOKEN)
- Active account: true
GH_TOKEN(または GITHUB_TOKEN)環境変数がセットされていると、gh はそれを最優先で使います。つまりこの状態だと、gh auth switch で別アカウントに切り替えようとしても環境変数が勝って無視されます。
.zshrc などでグローバルに export GH_TOKEN=... していないか確認しておきましょう。
grep -rn "GH_TOKEN\|GITHUB_TOKEN" ~/.zshrc ~/.zprofile ~/.zshenv
実はこの「GH_TOKEN が最優先される」という挙動こそが、今回の自動切り替えの肝になります。
作戦:グローバルはデフォルト、プロジェクトだけ上書き
gh には「ディレクトリごとにアカウントを変える」というネイティブ機能はありません。そこで direnv を組み合わせます。
direnv は、.envrc というファイルを置いたディレクトリに cd すると、そこに書いた環境変数を自動で読み込んでくれるツールです。ディレクトリから出ると自動でアンロードされます。
方針はこうします。
- グローバル(
.zshrc)のGH_TOKENは普段使いのaccount-mainのまま残す → デフォルトアカウント - 特定プロジェクトの
.envrcだけでGH_TOKENを別アカウントのトークンに上書きする
.envrc で export した環境変数はそのディレクトリ内でグローバルのものを上書きするので、「普段は account-main、このプロジェクトだけ account-b」が自然に実現できます。
手順
1. direnv のインストールと有効化
brew install direnv
シェルにフックを追加します(zsh の場合は ~/.zshrc に以下を追記)。
eval "$(direnv hook zsh)"
追記したらシェルを開き直すか source ~/.zshrc で反映します。
2. プロジェクト専用アカウントのトークンを用意する
切り替えたいアカウント(ここでは account-b)でログインした状態で、Personal Access Token (classic) を発行します。
スコープは用途に合わせますが、gh で PR 操作や CI 連携まで行うなら以下あたりを付けておくと無難です。
repoworkflowread:orgproject
発行された ghp_xxxxxxxxxxxx を控えておきます。
3. プロジェクトに .envrc を置く
切り替えたいプロジェクトの直下に .envrc を作成します。
# このプロジェクトは account-b で操作する(グローバルの account-main を上書き)
export GH_TOKEN=ghp_xxxxxxxxxxxx
.envrc を初めて置いた(または編集した)ときは、安全のため direnv が許可を求めてきます。一度だけ許可します。
cd ~/projects/project-a
direnv allow
これで、このディレクトリにいる間だけ GH_TOKEN が account-b のトークンに切り替わります。
4. トークンを Git 管理から除外する
.envrc にはトークンという秘密情報が入るので、絶対にコミットしてはいけません。
チームで共有しているリポジトリの場合、リポジトリの .gitignore を勝手に書き換えたくないこともあります。そういうときは、自分の環境全体で効くグローバル gitignore に追加しておくと、どのリポジトリでも自動的に無視されて便利です。
.envrc
.direnv/
~/.config/git/ignore は git が標準で参照してくれるパスです(macOS / Linux の場合)。ちゃんと無視されているか確認しておきましょう。
cd ~/projects/project-a
git check-ignore .envrc # .envrc と表示されれば無視されている
5. コミット author もプロジェクトごとに変える
gh のアカウントだけでなく、git のコミット author(user.name / user.email)も分けたいケースは多いです。これは direnv ではなく、リポジトリローカルの git 設定で対応するのが確実です。
切り替えたいプロジェクトの中で、--local を付けて設定します。
cd ~/projects/project-a
git config --local user.name "account-b"
git config --local user.email "you@project.example.com"
--local なのでこのリポジトリ内だけに効き、他のプロジェクトはグローバル設定(account-main)のままです。
メモ: GitHub にコミットを
account-b名義として正しく表示させるには、user.emailをaccount-bアカウントに登録済みのメールにする必要があります。メールを公開したくない場合は、GitHub の メール設定 で確認できる12345678+account-b@users.noreply.github.com形式の noreply アドレスを使うとよいです。
動作確認
最後に、ちゃんと切り替わっているか確認します。
プロジェクト内(account-b になっているはず):
cd ~/projects/project-a
gh api user --jq '.login' # => account-b
git config user.name # => account-b
git config user.email # => you@project.example.com
プロジェクトの外(普段使いの account-main のまま):
cd ~/other-project
gh api user --jq '.login' # => account-main
cd で行き来するだけで、gh のアカウントも git の author も自動で切り替わるようになりました 🎉
おまけ:AI コーディングツールと相性が良い
この仕組みは、Claude Code や Cursor のような AI コーディングツール経由で開発するときに特に効いてきます。
これらのツールはターミナルでコマンドを実行できるので、gh CLI が使える環境なら AI に「この PR の内容を見て」「レビューコメントを確認して」と頼むだけで、AI が gh を叩いて PR の差分やコメントを直接取得し、文脈を踏まえた作業をしてくれます。
gh pr view 123 # PR の概要・本文を表示
gh pr diff 123 # PR の差分を表示
gh pr view 123 --comments # レビューコメントを取得
このとき、.envrc でプロジェクトごとに gh のアカウントが切り替わっていれば、AI もそのプロジェクトのアカウントの権限で gh を実行してくれます。つまり、
- プロジェクト A を開いて AI に作業させると
account-bの権限で PR を参照・操作 - プロジェクト B では
account-mainの権限で操作
というように、人間が手動で切り替えなくても、AI が「今いるディレクトリの正しいアカウント」で GitHub を操作してくれるわけです。AI に毎回「どのアカウントで操作して」と指示する必要がなく、アカウントの取り違え事故も防げます。
まとめ
-
GH_TOKEN環境変数はghの認証で最優先される。この性質を逆手に取る - グローバルの
GH_TOKENは普段使いアカウントのデフォルトとして残す - 切り替えたいプロジェクトにだけ
.envrcを置き、direnvでGH_TOKENを上書きする - コミット author は
git config --localでリポジトリごとに設定する -
.envrcはグローバル gitignore で無視してトークン流出を防ぐ
手動の gh auth switch と違って切り替え忘れが起きないので、複数アカウントを日常的に行き来する人にはかなり快適になります。
おわりに
複数の GitHub アカウントをプロジェクトごとに自動で使い分ける方法を、gh CLI と direnv の組み合わせで紹介しました。
トークンの有効期限が切れると gh が Bad credentials(401)を返すようになるので、その場合は新しいトークンを発行して .envrc の1行を差し替えるだけで復活します。
こちらの記事が皆さんのお役に立てれば幸いです。