[GitHub] 複数アカウントを扱うときのメモ (WSL2)

# はじめに
最近、インターン生として業務に参加しました。
そのなかで業務用の GitHub アカウントを頂いたんですが、私用のアカウントとの使い分けがちょっとだけ難しかったので、忘れないようにメモを残しておきます。

(WSLを使用しているので、他環境の場合は適宜読み替えてください)

# 前提：GitHub における複数アカウントの所持について
GitHub による[アカウント利用条件について](https://docs.github.com/ja/site-policy/github-terms/github-terms-of-service#b-account-terms)に、以下のように記載があります。

> 保有できる無料アカウントは 1 つのみです。

そのため、複数アカウントの使用にはくれぐれもご注意ください。特に理由がない限り、無料アカウントを複数持つことは推奨されません。

# 早速やってみる
例として、以下の2つのアカウントを用意しました。

```
main main@example.com
sub sub@example.com
```

また、`main`のほうのアカウントには ssh 鍵の登録がされているものとします。
GitHub アカウントに ssh 鍵を紐づける方法については詳しく解説された記事があるので、こちらを参考にしてください。

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh

そしたら、`sub`のほうに紐づける ssh 鍵を生成します。前提として、**１アカウントにつきひとつの ssh 鍵を使用します**。

```sh
ssh-keygen -t rsa
```

コマンドを実行すると、以下のようにファイル名を決めるメッセージが出ます。ここでは `id_sub_rsa` としますが、任意で変更してください。
パスワードに関してはしなくても構いません。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yotu/.ssh/id_rsa):
```

そしたら`~/.ssh`フォルダを開き、`config`ファイルを作ります。すでに存在している場合は編集します。

```sh
cd ~/.ssh
vi config
```

開いたら、以下のように編集します。

```config
# メインアカウント
Host github
	HostName github.com
	IdentityFile ~/.ssh/id_rsa
	User git
	Port 22
	TCPKeepAlive yes
	IdentitiesOnly yes

# サブアカウント
Host github-sub
	HostName github.com
	IdentityFile ~/.ssh/id_sub_rsa  # ←さっき作ったファイル
	User git
	Port 22
	TCPKeepAlive yes
	IdentitiesOnly yes
 ```

 サブアカウントの `IdentityFile` に、先ほど作成した ssh 鍵のファイル名を指定します。あとは大体コピーでOK。

ここまでできたら、以下のコマンドで ssh 接続の確認をしてみます。

```sh
ssh -T github-sub
```

問題がなければ、以下のようにメッセージが返されます。

```sh
$ ssh -T github-sub
Hi sub! You've successfully authenticated, but GitHub does not provide shell access.
```

このメッセージが表示されなかったり、`sub`と表示されているところがサブアカウント名以外だった場合、うまくいってない可能性が高いです。
その場合は、`config`ファイルの記述が正しいか見直してください。

# アカウントの切り替え
ここまで ssh 鍵の連携をしてきましたが、いちどに扱えるアカウントはひとつです。そのため、例えばサブアカウントで作業したい場合、以下のようなコマンドでサブアカウントに切り替えをする作業が毎回必要です。

```sh
git config --global user.name "sub"
git config --global user.email "sub@example.com"
```

こんなコマンド、毎回打つのは面倒です。なので、コマンド一つでできるようにしちゃいましょう。
まずは以下のコマンドで`~/.bashrc` を開きます。zsh の場合は `~/.zshrc` に書き換えてください。

```sh
vim ~/.bashrc
```

そしたら一番下に以下のように追加します。zsh も同様です。

```bash
function gitmain() {
  git config --global user.name "main"
  git config --global user.email "main@example.com"
}

function gitsub() {
  git config --global user.name "sub"
  git config --global user.email "sub@example.com"
}
```

関数名 = コマンド名です。
入力を保存したら、いちどコンソールを再起動します。

そしたら、サブ垢に切り替えてみます。以下のように、さっき登録したコマンドをそのまま打つことで実行できます。

```sh
gitsub
```

とくにメッセージなどは出ませんが、以下のコマンドで変更されたかを確認することができます。

```sh
git config --global user.name
git config --global user.email
```

たとえば私の場合、以下のように表示されます。

```sh
$ git config --global user.name
sub

$ git config --global user.email
sub@example.com
```

メインアカウントに戻すには、`gitmain`コマンドを実行するだけです。

# サブアカウントで参加しているリポジトリをクローンする
ここまでサブアカウントの追加をしてきましたが、サブアカウントで`git clone`したりするときは注意が必要です。

例として、`piyo`さんの`piyopiyo`という**プライベートな**リポジトリを クローンするとします。
サブアカウントには`piyopiyo`のアクセス権がありますが、メインアカウントにはありません。

いつものようにリポジトリのページから ssh を利用したクローンのコマンドをコピーペーストすると、以下のような感じになります。

```sh
git clone git@github.com:piyo/piyopiyo.git
```

ただし...このコマンドはうまく動作しません。
おそらく、以下のようなエラーが発生すると思います。

```sh
$ git clone git@github.com:piyo/piyopiyo.git
Cloning into 'piyopiyo'...
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

要約すると「`piyopiyo` なんてリポジトリは見つからないよ！」と言われています。これは、デフォルトだとメインアカウントのほうの ssh 鍵でアクセスされるためです。

ホストを指定してアクセスする場合、以下のように変更します。

```sh
git clone <ホスト名>:piyo/piyopiyo.git
```

「ホスト名」というのは、`config` に指定した `Host`の部分です。この場合、サブアカウントのホスト名は `github-sub` です。
変更を適用したものが下のような感じ。

```sh
git clone github-sub:piyo/piyopiyo.git
```

こうすることでサブアカウントの ssh 鍵が使用され、認証が通ります。