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接続 + パーソナルアクセストークン利用

たぶんこれが一番楽だと思います。


セットアップ手順

  • GitHub CLI(gh)を導入する。
  • 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.emailuser.namegit 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