複数のGit/GitHubアカウントを切り替えるための設定

1つのPCで複数のGit/GitHubアカウントを扱う際の設定方法をまとめました。リポジトリごとにGitのユーザーやghコマンドのログイン中アカウントを自動で切り替えられるようにします。

目次

はじめに

1つのPCで複数のGit/GitHubアカウントを使い分けたいとき、Gitのユーザーや gh コマンドのログイン中アカウントをリポジトリごとに自動で切り替えられると便利です。 本記事では、そうした切り替えを手軽に実現するための自分なりの設定方法をまとめました。

方針

全体ではメインアカウントをデフォルトとし、一部のディレクトリでのみサブアカウントを適用する構成にします。

ディレクトリ構成

git clone する場所をアカウントごとに分けています。

~/workspaces/
├─ main-account/
│ ├─ repository-main-1/
│ └─ repository-main-2/
└─ sub-account/
├─ repository-sub-1/
└─ repository-sub-2/

「サブアカウントで扱いたいリポジトリは sub-account/ にcloneする」といった形です。

サブアカウントで扱うリポジトリが特定のディレクトリにまとまってさえいれば、必ずしも上記と同じ構成でなくても以降の設定も適用できます。

Gitユーザーの切り替え設定

gitconfigの includeIf を活用します。

~/.gitconfig
[user]
name = main-account
email = main-account@example.com
[includeIf "gitdir:~/workspaces/sub-account/"]
path = ~/.gitconfig.sub
~/.gitconfig.sub
[user]
name = sub-account
email = sub-account@example.com

この設定により、デフォルトではメインアカウントの nameemail が適用されます。 そして sub-account ディレクトリにいるときだけ ~/.gitconfig.sub の設定が効き、 nameemail がサブアカウントのもので上書きされます。

GitHubアカウントの切り替え設定

gh コマンドでログインするGitHubアカウントも、リポジトリごとに切り替えられるようにします。

gh の設定ファイルディレクトリをアカウントごとに用意し、作業ディレクトリに応じて適用する設定ファイルを切り替える形を採用しました。 メインアカウントの設定にはデフォルトの ~/.config/gh/ を使い、サブアカウントの設定用に別途 ~/.config/gh-sub/ を設けています。

~/.zshrc に以下のフックを書くことで、 sub-account ディレクトリにいるときだけ gh-sub の設定が効くようにします。

~/.zshrc
_switch_gh_config() {
if [[ "$PWD" == "$HOME/workspaces/sub-account"* ]]; then
export GH_CONFIG_DIR="$HOME/.config/gh-sub"
else
unset GH_CONFIG_DIR
fi
}
autoload -Uz add-zsh-hook
add-zsh-hook chpwd _switch_gh_config
_switch_gh_config

あとはそれぞれのディレクトリで gh auth login すれば設定は完了です。

補足: gh auth switch

自分はアカウントごとにSSHやHTTPSといったプロトコル設定なども使い分けたかったため、適用する設定ファイルを切り替える形をとりました。

一方アカウント名以外の設定が同じなのであれば、 gh auth switch コマンドを使った方がより手軽に設定できます。 gh auth login コマンドを複数回実行して全アカウントのログインを済ませた後、以下のコマンドを実行することで、特定のGitHubアカウントへログイン状態を切り替えられます。

gh auth switch --user <GitHubアカウント名>

補足: direnv

direnv を活用すれば、ディレクトリごとに環境変数を切り替えられます。 そのため sub-account ディレクトリにdirenvで GH_CONFIG_DIR を埋めるよう設定すれば、 ~/.zshrc にフックを足さずに同じことを実現できます。

ただしサブアカウントのリポジトリでdirenvを使いたい場合、親ディレクトリのdirenvを適用する設定( source_up )を、そのリポジトリの .envrc に追加する必要があります。 自分は個人の環境設定の事情で各リポジトリに影響が出るのがしっくりこなかったため、direnvによる切り替えは採用しませんでした。