GitHub CLI のアカウントをディレクトリごとに自動切り替えする

2026-06-19 hit count image

個人アカウントと仕事用アカウントを行き来するたびに gh auth switch を実行する手間をなくす方法を紹介します。 GH_TOKEN 環境変数と zsh の chpwd フックを組み合わせて、ディレクトリに入った瞬間にアカウントが自動で切り替わるよう設定します。

environment

はじめに

個人プロジェクトと仕事のプロジェクトを並行して作業していると、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 switchX(グローバル状態)XX
direnv + GH_TOKENOO必要
chpwd + GH_TOKENOOX

chpwd フックと GH_TOKEN の組み合わせは、追加ツール不要でディレクトリ移動だけで GitHub CLI のアカウントを自動切り替えします。環境変数でトークンを受け付ける CLI ツールであれば、同じパターンでディレクトリごとのアカウント分離を実現できます。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

アプリ広報

今見てるブログを作成たDekuが開発したアプリを使ってみてください。
Dekuが開発したアプリはFlutterで開発されています。

興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。



SHARE
Twitter Facebook RSS