GitHub CLIで複数のGitHubアカウントを切り替える
個人用と仕事用、どちらの鍵を設定すれば良いか問題
複数のGitHubアカウントを利用する場合、GitHubへのアクセスにSSHを利用すると、面倒な時がある。
SSHへの接続には、.ssh/configに定義された鍵が使われるが、
例えば、個人用アカウントと仕事用アカウントを併用しているような場合、.ssh/configの設定でどのように設定すればいいか困ることになる。
「個人用と仕事用、どちらの鍵を設定すれば良いか」問題です。
"Host github-work"とか、別の名前を定義する方法もありますけど。
Host github.com
    HostName github.com
    User git
    Port 22
    IdentityFile ~/.ssh/id_ed25519.home # <--- 個人用と仕事用、どちらの鍵を設定すれば良い?
ではどうするか?こうするべし
- GitへはHTTPSで接続する。
- パーソナルアクセストークンを認証に利用する。
- GitHub CLI(gh)でパーソナルアクセストークンを管理する。
- 複数のGitHubのアカウントの切替は、gh auth switchコマンドで行う。
GitHub CLIでアカウントの管理 + GitHub HTTPS接続 + パーソナルアクセストークン利用
たぶんこれが一番楽だと思います。
セットアップ手順
1. GitHub CLI(gh)の導入
Macの場合
brew install gh
Ubuntuの場合
(type -p wget >/dev/null || (sudo apt update && sudo apt-get install wget -y)) \ && sudo mkdir -p -m 755 /etc/apt/keyrings \ && out=$(mktemp) && wget -nv -O$out https://cli.github.com/packages/githubcli-archive-keyring.gpg \ && cat $out | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \ && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \ && sudo mkdir -p -m 755 /etc/apt/sources.list.d \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \ && sudo apt update \ && sudo apt install gh -y sudo apt update sudo apt install gh
2. GitHub CLI(gh)の設定
gh auth loginコマンドで、アカウントのパーソナルアクセストークンを取得します。
Gitの操作で使うプロトコルはHTTPSを選択します。
作成したパーソナルアクセストークンはghで管理されます。
gh auth login
? Where do you use GitHub? -> GitHub.com # もしくはGitを管理するサービスのドメイン ? What is your preferred protocol for Git operations on this host? -> HTTPS ? Authenticate Git with your GitHub credentials? -> Yes ? How would you like to authenticate GitHub CLI? -> Login with a web browser # Webブラウザを使える環境ならこちらを選択 -> Paste an authentication token # リモートのサーバ環境とかなら、こちらを選択
複数のGitHubアカウントがあるので、利用するアカウントの数だけ、git auth loginコマンドで認証を行います。
ひととおりアカウントを設定したら、git auth setup-gitコマンドで、認証をgh経由で行うように設定します。
gh auth setup-git
利用手順
Gitの操作
GitHubのレポジトリをcloneする時は、HTTPSのURLでcloenするか、ghコマンドを使います。
GitHubとの接続には、ghの管理するパーソナルアクセストークンが使われます。
git clone https://github.com/foo/var
# or
gh repo clone foo/var
GitHubに接続するアカウントを切り替える
GitHubに接続するアカウントを切り替える際は、gh auth switchコマンドを使用します。
git auth switch
が、しかし、Git接続時に使われるuser.email、user.nameはgit auth switchでは変更されません。
これは別でgit configで設定することになります。
git config --global user.name "taku-o" git config --global user.email "mail@nanasi.jp"
アカウント切り替えスクリプト例 (~/bin/git-switch-account)
アカウント切替については、おそらく何度も実行することになるので、スクリプトにまとめておくと良いでしょう。
#!/bin/bash # 引数が指定されているか確認 if [ -z "$1" ]; then echo "使用法: $0 <user>" echo "利用可能なアカウント: taku-o, user1" echo "事前にgh auth loginしてください" echo "gh auth login --hostname github.com" exit 1 fi COMMAND="$1" # 最初の引数をCOMMAND変数に格納 case "$COMMAND" in "taku-o") echo "Gitアカウントをgithub.com mail@nanasi.jpに切り替えます..." git config --global user.name "taku-o" git config --global user.email "mail@nanasi.jp" gh auth switch --user taku-o --hostname github.com ;; "user1") echo "Gitアカウントをgithub.com user1@example.comに切り替えます..." git config --global user.name "user1" git config --global user.email "user1@example.com" gh auth switch --user user1 --hostname github.com ;; *) # 上記のどれにも一致しない場合 echo "無効なアカウント: $COMMAND" echo "利用可能なアカウント: taku-o, user1" exit 1 ;; esac exit