複数のGitHubアカウントの自動切り替え設定

## はじめに


会社用と個人開発用の GitHub アカウントの切り替えがめんどくさいなと感じたので、自動で切り替える設定をしました。

多分このように感じている方って多いかと思います。

この記事の設定をすることで、ディレクトリ毎に GitHub アカウントを自動で切り替えてくれるので、アカウントの切り替えを気にせずに開発ができます。

## 動作環境

- マシン： MacBook Pro (16-inch, 2019)
- OS：    macOS Big Sur バージョン 11.5.2
- シェル： zsh 5.8


## 作業手順


### 秘密鍵と公開鍵を作成する

すでに GitHub のアカウントを持っていることを前提に進めます。

.ssh ディレクトリに移動します。

```zsh:
$ cd ~/.ssh
```

.ssh ディレクトリで 新しく秘密鍵と公開鍵を作成します。

このとき、既存の鍵のファイル名と異なるファイル名にしておかないと、  
既存の鍵が上書きされてしまうので注意して下さい。  

デフォルトだと、`id_rsa` になっているはずなので、今回は `id_sub_rsa` と設定します。  



```zsh:~/.ssh
# 鍵の作成コマンド
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):id_sub_rsa #既存のファイル名とは異なる任意のファイル名を入力する
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

1つ目の質問が鍵のファイル名の設定となります。

鍵のファイル名を設定せずにエンターを押してしまうと、  
既存の鍵の設定を上書きしてしまうので注意してください。変わってしまいます。

鍵ができているか確認してみます。

```zsh:~/.ssh
$ ls
id_rsa    id_rsa.pub    id_sub_rsa    id_sub_rsa.pub    config
```

先程設定したファイル名（ `id_sub_rsa` と `id_sub_rsa.pub` ）で公開鍵と秘密鍵ができていますね。


### 作成した公開鍵をGitHubに設定する

https://github.com/settings/ssh で公開鍵の設定をします。  
画面右上部の「New SSH key」をクリックします。

![GitHub01 SSH key 設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756415/ac5f4376-3247-9009-0c74-73e9194d3071.png)


「title」に公開鍵名、「key」に公開鍵の中身を入力します。

![GitHub02 SSH keys : add new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756415/597db47c-4042-719c-f8ad-fd8718ddddb2.png)


なので今回であれば、  
「title」 は`id_sub_rsa.pub`、「key」 は`id_sub_rsa.pub の中身`となります。

入力が完了しますと、下記のように GitHub に公開鍵が設定されます。

![GitHub03 SSH keys : 公開鍵設定済.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756415/d222f6a7-abff-a6c4-2f86-2c7f7508371f.png)



### configファイルにサブアカウントを設定する

GitHub に作成した公開鍵が設定できたので次は、
サブアカウントの情報を `.ssh` ディレクトリの `config` ファイルに、サブアカウントの情報を設定します。

`config` ファイルがなければ下記のコマンドに作成します。

```zsh:~/.ssh
$ touch config
```

今回は、`config` ファイル設定します。  


```diff:~/.ssh
# メインアカウント
Host GitHub
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa
  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
```

上記のようにサブアカウントを設定します。


`Host` は、任意のホスト名を設定します。こちらは、GitHub との接続で使用します。  
`IdentityFile` は、秘密鍵の場所を設定します。
上記以外はコピーで大丈夫です。

これでサブアカウントの公開鍵の認証を行い GitHub と接続ができます。


### GitHubと接続する

GitHub アカウントとの接続を確認します。

先程 `~/.ssh/config` に設定した `Host` 名を使用します。

下記のコマンドで接続を確認できます。

```zsh:
$ ssh -T [Host名]
```

アカウントの接続状況確認する際は下記のコマンドで確認ができます。

```zsh:
# メインアカウントの接続確認
$ ssh -T GitHub
Hi [メインアカウントのユーザー名] You re successfully authenticated, but GitHub does not provide shell access.

# サブアカウントの接続確認
$ ssh -T GitHub-sub
Hi [サブアカウントのユーザー名] You ve successfully authenticated, but GitHub does not provide shell access.
```

接続ができていることを確認できました。


### 自動でディレクトリごとにGitHubのアカウントを切り替える設定

さて本題の、ディレクトリ毎に GitHub アカウントを自動で切り替える設定をしたいと思います。


メインアカウント用とサブアカウント用の `~/.gitconfig` ファイルを作成し、設定します。

メインアカウントを `~/.gitconfig` ファイルに、  
サブアカウントを `~/.gitconfig_sub` ファイルに設定します。

ファイルが無い方は作成してください。

それでは、`~/.gitconfig` ファイルにメインアカウントの情報を追記します。

```zsh:~/.gitconfig
[user]
	name = [メインアカウント名]
	email = [メインアカウントのメールアドレス]
```

次に、`~/.gitconfig_sub` ファイルにサブアカウントの情報を記載します。

```zsh:~/.gitconfig_sub
[user]
	name = [サブアカウント名]
	email = [サブアカウントのメールアドレス]
```

GitHub のサブアカウントで使用したいディレクトリを `~/.gitconfig` ファイルに追記します。　

```diff:~/.gitconfig
[user]
	name = [メインアカウント名]
  email = [メインアカウントのメールアドレス]

+ [includeIf "gitdir:~/path/to/your-private/"]
+   path = ~/.gitconfig_sub
```

`[includeIf "gitdir:~/path/to/your-private/"]` で、サブアカウントを使用したいディレクトリを設定します。

`path = ~/.gitconfig_sub` で、サブアカウント用の `~/.gitconfig_sub` の情報を引用するように設定しています。

例えば、ホームディレクトリ配下の`テスト`ディレクトリ（`~/test/`）でサブアカウントを使って開発したい場合は、

```zsh:~/.gitconfig
[user]
	name = [メインアカウント名]
  email = [メインアカウントのメールアドレス]

[includeIf "gitdir:~/test/"]
  path = ~/.gitconfig_sub
```

という設定なります。

こちらの設定をしていれば、`test` ディレクトリ配下に新たなディレクトリを作成しても、サブアカウントを自動で設定してくれます。


### リモートと接続する際の注意点

サブアカウントでリモートと接続する際に注意点があります。

`~/.ssh/config` で設定した Host 名を用いて接続する必要があります。

通常リモートと接続する場合は、
```zsh:
$ git remote add origin git@github.com:<アカウント名>/<リポジトリ名>.git
```
と `git@github.com` を使用しますが、  
これですと、メインアカウントかサブアカウントかどちらを使用するのかわかないと混乱するようです。

なので Host 名を使用してリモートと接続する必要があります。

今回であれば、メインアカウントは `GitHub`、サブアカウントは `GitHub-sub` ですので

```zsh:
#メインアカウントのリモートと接続
$ git remote add origin git@GitHub:<アカウント名>/<リポジトリ名>.git

#メインアカウントのリモートと接続
$ git remote add origin git@GitHub-sub:<アカウント名>/<リポジトリ名>.git
```

とする必要があります。


## さいごに

メインアカウントとサブアカウントの切り替えを自動でしてくれるので、無駄な手間が省けます。  
アカウント切り替えを忘れることの防止にもなりますね。

一度設定してしまえば、あとは何もしなくていいので便利です。


## 参考

[複数のGitHubアカウントを使い分けたい時の設定方法とTips](https://zenn.dev/taichifukumoto/articles/how-to-use-multiple-github-accounts)

[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)