🔄

GitHub CLI のアカウントをレポジトリごとに自動的に切り替える

に公開

TL;DR

社用とプライベート用などで複数の GitHub アカウントを使い分けている場合、レポジトリを移動するたびに gh コマンドのログインユーザーを切り替えるのが面倒だった

Git の user.email に基づいて gh のアカウントを切り替える shell script を作成し、gh のエイリアスとして設定することで、レポジトリごとのアカウント切り替えを完全に自動化できた

モチベーション

弊社のように GitHub Enterprise などを導入した企業の社員は社用とプライベート用で複数の GitHub アカウントを切り替えて使用していることが多いと思う

この場合 GitHub の UI 上の操作ブラウザのプロファイル単位で切り替えるなどすれば特に問題ないが、困るのは gh (GitHub CLI) でのユーザー切り替えである

gh は複数のユーザーのログイン状態を同時に保持しておくことはできるが、各種操作を行う場合には当然操作を行いたいユーザーに切り替える (gh auth switch) 必要がある

「操作を行いたいユーザー」とはほとんどの場合機械的に求まる (業務レポジトリなら社用アカウント、それ以外ならプライベートアカウントなど) ものであるから、どうにか切り替えを自動化できないか考えた

実装・設定

社用レポジトリとプライベートレポジトリでは Git の user.email にそれぞれ対応する社用とプライベート用のメールアドレスを設定していることに注目した
※同一のメールアドレスを複数の GitHub アカウントに紐づけることはできないため、複数の GitHub アカウントを運用している方はメールアドレスをレポジトリごとに使い分ける設定が済んでいることになる

なお余談ながら、この Git アカウントはディレクトリに基づいて自動的に切り替えるように設定ができる
本稿の内容と合わせて運用するのがおすすめである

https://kakakakakku.hatenablog.com/entry/2019/11/06/114926

gh のアカウント自動切り替えスクリプト

Git の設定に基づいて gh のアカウントを自動的に切り替える shell script ghautoswitch を作成する

責務は user.email の値を取得し、社用のメールアドレスであった場合には社用、それ以外の場合はプライベート用の GitHub アカウントに切り替えることまで

ghautoswitch
#!/usr/bin/env bash

set -euo pipefail

if ! email=$(git config user.email); then
  echo 'user.email is not defined.'
  exit 0
fi

if [ "$email" = "john.doe@company.com" ]; then
  gh auth switch --user johndoe-work
else
  gh auth switch --user johndoe-private
fi

Shell エイリアスの設定

gh コマンドのエイリアスとして設定することで、gh コマンド実行前に必ず自動切り替えが行われるようにする

~/.zshrc
alias gh='ghautoswitch && gh'

これにより、どのレポジトリでも gh コマンドを実行するだけで、適切なアカウントが自動的に選択される

使用例

# 社用レポジトリで実行
cd ~/work/company-project
gh pr create  # 自動的に社用アカウントに切り替わってからプルリクエスト作成

# 個人開発のレポジトリで実行
cd ~/personal/my-project
gh pr create  # 自動的にプライベートアカウントに切り替わってからプルリクエスト作成

結果

従来通り gh コマンドを叩くだけで、アカウントは勝手に適切なものを使用してくれる、という体験が実現できかなり快適になった

ただエイリアスの性質上、毎回 gh auth switch が実行されるため、わずかな実行時間のオーバーヘッドがあることには留意されたい
個人的にはほとんど気にならない程度だった

Discussion