目次
はじめに
個人プロジェクトと仕事のプロジェクトを並行して作業していると、GitHub CLI(gh)を使うたびにアカウントを切り替えなければならない場面が出てきます。気づかずに会社アカウントでイシューを立てていたり、個人アカウントで PR を作ってしまったりしがちです。
gh auth switch で解決できますが、ディレクトリを移動するたびに実行するのは思いのほか手間がかかります。
この記事では、GH_TOKEN 環境変数と zsh の chpwd フックを組み合わせて、ディレクトリに入った瞬間に GitHub CLI のアカウントが自動で切り替わる設定を紹介します。
gh auth switch の問題点
gh はアクティブなアカウントを次のコマンドで切り替えられます。
gh auth switch --user <アカウント名>
しかしこの方法はグローバルな状態を変更します。ターミナルのタブ A でアカウントを切り替えると、タブ B にも影響します。複数のプロジェクトを同時に開いて作業しているときは、どのアカウントがアクティブなのかわからなくなりがちです。
GH_TOKEN 環境変数を使う方法
GH_TOKEN 環境変数が設定されていると、gh は保存済みアカウントの代わりにそのトークンを優先的に使用します。
export GH_TOKEN=ghp_xxxxxxxxxxxx
gh pr list # GH_TOKEN のアカウントで実行される
環境変数はシェルセッション単位で分離されます。ターミナルのタブ A とタブ B でそれぞれ異なる GH_TOKEN を持てるため、gh auth switch のグローバル状態の問題がありません。
すでに gh にログイン済みのアカウントであれば、トークンを新たに発行しなくても取り出せます。
gh auth token --user <個人アカウント名>
gh auth token --user <仕事用アカウント名>
chpwd フックで自動切り替えする
zsh の chpwd フックは、ディレクトリが変わるたびに実行される関数です。add-zsh-hook chpwd で登録すると、cd のたびに自動で呼び出されます。
ここに GH_TOKEN の切り替えロジックを書けば、ディレクトリに入った瞬間にアカウントが変わります。
設定コードの全体像
~/.zshrc に以下を追加します。
# GitHub CLI — ディレクトリに応じて GH_TOKEN を自動切り替え
# ~/personal/* → 個人アカウント
# それ以外 → 仕事用アカウント
_GH_TOKEN_PERSONAL=$(gh auth token --user <個人アカウント名> 2>/dev/null)
_GH_TOKEN_WORK=$(gh auth token --user <仕事用アカウント名> 2>/dev/null)
_gh_pick_account() {
case "$PWD/" in
"$HOME/personal/"*)
export GH_TOKEN="$_GH_TOKEN_PERSONAL" ;;
*)
export GH_TOKEN="$_GH_TOKEN_WORK" ;;
esac
}
add-zsh-hook chpwd _gh_pick_account
_gh_pick_account
gh() {
local label
case "$PWD/" in
"$HOME/personal/"*) label="個人" ;;
*) label="仕事" ;;
esac
print -P "%F{cyan}▶ GitHub アカウント: %B${label}%b%f"
command gh "$@"
}
適用:
source ~/.zshrc
動作の仕組み
1. シェル起動時にトークンをキャッシュする
_GH_TOKEN_PERSONAL=$(gh auth token --user <個人アカウント名> 2>/dev/null)
_GH_TOKEN_WORK=$(gh auth token --user <仕事用アカウント名> 2>/dev/null)
gh auth token は呼び出すたびにわずかな遅延が生じます。シェル起動時に一度だけ呼び出して変数に保存しておくことで、ディレクトリ移動のたびに余分な待ち時間なく即座に切り替えられます。
2. chpwd フックで GH_TOKEN を切り替える
_gh_pick_account() {
case "$PWD/" in
"$HOME/personal/"*)
export GH_TOKEN="$_GH_TOKEN_PERSONAL" ;;
*)
export GH_TOKEN="$_GH_TOKEN_WORK" ;;
esac
}
add-zsh-hook chpwd _gh_pick_account
_gh_pick_account # シェル起動時に現在のディレクトリにも即時適用
$HOME/personal/ 以下のディレクトリでは個人アカウントのトークンを、それ以外では仕事用アカウントのトークンを設定します。末尾の _gh_pick_account 呼び出しにより、新しいターミナルを開いたときも即座に適用されます。
gh ラッパーで現在のアカウントを確認する
アカウントが自動で切り替わると、今どのアカウントで実行されているか把握しにくくなります。gh コマンドをラップして実行前に現在のアカウントを表示すると、誤操作を防げます。
gh() {
local label
case "$PWD/" in
"$HOME/personal/"*) label="個人" ;;
*) label="仕事" ;;
esac
print -P "%F{cyan}▶ GitHub アカウント: %B${label}%b%f"
command gh "$@"
}
これで gh コマンドを実行すると、次のように現在のアカウントが表示されます。
▶ GitHub アカウント: 個人
まとめ
| 方法 | セッション間の分離 | 自動切り替え | 追加ツール |
|---|---|---|---|
gh auth switch | X(グローバル状態) | X | X |
direnv + GH_TOKEN | O | O | 必要 |
chpwd + GH_TOKEN | O | O | X |
chpwd フックと GH_TOKEN の組み合わせは、追加ツール不要でディレクトリ移動だけで GitHub CLI のアカウントを自動切り替えします。環境変数でトークンを受け付ける CLI ツールであれば、同じパターンでディレクトリごとのアカウント分離を実現できます。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Dekuが開発したアプリを使ってみてください。Dekuが開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。