GitHubの複数アカウントを使い分けるならSSHよりhttpsの方がいいんじゃね？という話

# はじめに

1台のPCで複数のGitHubアカウントを使い分けたくなるシーンがたびたびあります。
たとえば会社のPCを使っている時に、自分のプライベートなリポジトリにちょっとしたコードをコミットするときなど。

そのような、「1台のPCで複数のGitHubアカウントを使い分ける」方法について、SSHを使った方法は調べると多くの方々の記事が出てきます。

- [【メモ】githubの複数アカウントにSSH接続するための設定手順](http://dev.classmethod.jp/tool/github-ssh-sub-account-setting/)
- [同一端末で、複数のGitHubアカウントを使い分ける方法](https://github.com/youkinjoh/TrainingWebSocket/wiki/%E5%90%8C%E4%B8%80%E7%AB%AF%E6%9C%AB%E3%81%A7%E3%80%81%E8%A4%87%E6%95%B0%E3%81%AEGitHub%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95
)
- [GitHubで複数のアカウントを使う場合のSSHの設定](http://qiita.com/merrill/items/80a8d8a152e2483fa587)

が、httpsを使った方法はあまりweb上に情報が無いような気がします。

両方試してみたところhttpsの方がお手軽な感じがしたので
せっかくなので2つの設定方法をメモしておきます。

※ 元々は自身のブログにも投稿していた内容なんですが、どちらがオススメなのか皆さんからも意見を伺いたいと思い投稿しました。
[1台のPCで複数のGitHubアカウントを使う(SSHとhttps) - dackdive's blog](http://dackdive.hateblo.jp/entry/2015/10/12/210547)




# 前提

メインで使うアカウントについては
すでにSSH鍵の登録や `git config --global` でユーザー名、メールアドレスなどの設定が済んでいるものとします。  

# TL;DR

### 1. SSH の場合

- サブアカウント用のSSH鍵を生成し、GitHub に登録する
- `~/.ssh/config` を編集し、サブアカウント用の Host 情報を定義する
- 以下、各リポジトリで
  - `git@[サブアカウントの Host]...` 形式の URL で clone や remote add する
  - `git config user.name, user.email` でサブアカウントのユーザ名・メールアドレスを設定

### 2. https の場合

- （なければ）`git credential-osxkeychain` をインストールする
- `git config --global credential.helper osxkeychain` を設定する
- 以下、各リポジトリで
  - `https://github.com:...` 形式の URL で clone や remote add する
  - `git config user.name, user.email` でサブアカウントのユーザ名・メールアドレスを設定
  - 一度だけサブアカウントのユーザー名・パスワードを入力して認証する


# 1. SSH を使った方法

こちらの手順については基本的に、上で挙げたサイトを参考にさせていただきました。

## サブアカウント用のSSH鍵を発行する

`ssh-keygen` コマンドで新しいSSH鍵を作成します。この時、既存の鍵を上書きしてしまわないように注意。

```zsh
$ cd ~/.ssh
$ ls
id_rsa              id_rsa.pub
# この場合、id_rsa 以外のファイル名を指定してSSH鍵生成
$ ssh-keygen -t rsa -C [メールアドレス] -f [ファイル名]
```


## GitHub サブアカウントにSSH鍵を登録する

GitHub にサブアカウントでログインし、https://github.com/settings/ssh にアクセスします。
「Add SSH Key」から、新しく作成したSSH鍵（`.pub` がつくほう）をコピペします。

この時、Mac だと以下のコマンドでファイルの内容をクリップボードに簡単にコピーできて便利です。
（参考：[Macな人は pbcopy が便利](http://qiita.com/mktakuya/items/c57a12b5b072a658acd0)）

```zsh
$ cat ~/.ssh/id_rsa_sub.pub | pbcopy
```

## ~/.ssh/config を編集する

`~/.ssh/config` というファイルを編集（なければ新規作成）し、以下のように記述します。

```zsh
Host github.com
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_rsa  # メインのアカウントのSSH鍵ファイルへのパス
  TCPKeepAlive yes
  IdentitiesOnly yes
Host github.com.sub  # (1) github.com以外で自分がわかりやすい名前
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_rsa_sub  # (2) サブアカウント用に生成したSSH鍵ファイルへのパス
  TCPKeepAlive yes
  IdentitiesOnly yes
```

`Host github.com` から始まるブロックがメインアカウント用の情報で、
`Host github.com.sub` で始まるブロックがサブアカウント用の情報です。

ポイントは↑にもコメントした通り2ヶ所で、
(1) メインアカウント用の `github.com` とは別に自分でわかりやすい名前を定義する
(2) `IdentityFile` 部分にサブアカウント用に先ほど生成したSSH鍵へのファイルを記述する

## サブアカウントを使用したいリポジトリで専用の Host を設定する

`git clone`  や `git remote add` でリポジトリを指定する際、

```zsh
$ git clone git@github.com:zaki-yama/multi-account-sample.git
$ git remote add origin git@github.com:zaki-yama/multi-account-sample.git
```

といったように、通常は `git@github.com:~` で始めます。
この `@` 以降を、先ほど `~/.ssh/config` に定義したサブアカウント用の `Host` に置き換えます。

```zsh
$ git clone git@github.com.sub:zaki-yama/multi-account-sample.git
$ git remote add origin git@github.com.sub:zaki-yama/multi-account-sample.git
```


## サブアカウントを使用したいリポジトリでuser.name, user.emailを変更する

`Host` の設定によりサブアカウントの GitHub リポジトリに push できるようになりますが、
これだけではまだ push した時のユーザー名がメインアカウントのものになってしまいます。

そのため、サブアカウントに切り替えたいリポジトリで、一度だけ以下のコマンドを実行し
ユーザー名とメールアドレスをサブアカウントのものに変更します。

```
$ git config user.name [サブアカウントのユーザー名]
$ git config user.email [サブアカウントのメールアドレス]
```



---

以上で設定は完了です。
今後このリポジトリについては普通に commit, push するだけでサブアカウントが使えます。

（余談ですが、ユーザー名はちゃんとサブアカウントのものなのに GitHub 上でアイコンが表示されない場合は `user.email` が間違ってる可能性あり）

![20151012034809.png](https://qiita-image-store.s3.amazonaws.com/0/36518/e0a4ef8e-f3a4-be7a-6245-8a7236a4def8.png)


# 2. https を使った方法

## サブアカウントを使用したいリポジトリで `https://github.com...` を使う

SSH の時は `git clone` や `git remote add` する際、`git@...` で始まる形式の URL でリポジトリを指定しましたが
https を使った方法では `https://github.com...` で始まる形式の URL で clone や remote add します。

```zsh
$ git clone https://github.com/zaki-yama/multi-account-sample.git
$ git remote add origin https://github.com/zaki-yama/multi-account-sample.git
```

ちなみに clone する時は GitHub で対象のリポジトリにアクセスし、右側の「HTTPS」という部分をクリックすると真上に https 版の URL が表示されるのでコピーすると良いです。

![20151012204634.png](https://qiita-image-store.s3.amazonaws.com/0/36518/b0f3e05f-fa0c-4847-a68e-b6691fc7e4e5.png)



## サブアカウントを使用したいリポジトリでuser.name, user.emailを変更する

SSH の時と同様なので省略。
やっぱりこっちの場合でもサブアカウント用のユーザー名・メールアドレスの設定は必要のようです。

## 認証情報を PC に保存する

この状態でコミットを push すると GitHub のアカウント名とパスワードを尋ねられるので
サブアカウント用の情報を入力すれば push することはできます。

```zsh
$ git push origin master
Username for 'https://github.com': zaki-yama
Password for 'https://zaki-yama@github.com':  # サブアカウントのパスワードを入力
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 283 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/zaki-yama/multi-account-sample.git
   26932c1..7bd5bee  master -> master
```

...が、このままだとローカルでの作業を push するたびに認証を求められてしまうので効率が悪いです。
そのため、認証情報を PC にキャッシュします。

認証情報を PC に保存する手順については以下の公式ドキュメントの通りにやれば OK です。
https://help.github.com/articles/caching-your-github-password-in-git

ここでは、私が使用している PC が Mac なので Mac でのやり方を記載しますが
Windows や Linux でも可能のようです。

### Mac での認証情報の保存

Mac の場合はパスワードの保存先に `キーチェーンアクセス.app` を使います。
まずはそのために必要な `git credential-osxkeychain` というコマンドがインストールされているかを確認します。
（Homebrew などで git をインストールした場合はこのコマンドも入ってるだろう、と上記ヘルプには記載されてます）

単にターミナルでコマンドを打ってみて、Usage が表示されれば OK。

```zsh
$ git credential-osxkeychain
Usage: git credential-osxkeychain <get|store|erase>
```

後はキーチェーンを使うよう `credential.helper` という config を設定します。

```zsh
$ git config --global credential.helper osxkeychain
```

なお、私はインストール済みだったので以下は未確認ですが、
コマンドが認識されなかった場合は curl でインストールする必要があるようです。

```zsh
$ git credential-osxkeychain
git: 'credential-osxkeychain' is not a git command. See 'git --help'.

# コマンドをインストールし、実行権限を付与する
$ curl -s -O https://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain
$ chmod u+x git-credential-osxkeychain

# コマンドは git と同じディレクトリに移動する
$ sudo mv git-credential-osxkeychain \
"$(dirname $(which git))/git-credential-osxkeychain"
# Password: [enter your password]
```

この状態で push すると、2回目以降は認証情報がキャッシュされてるのでユーザー名とパスワードを要求されなくなります。
ちなみに、キーチェーンアクセス.app を確認するとアカウント情報が保存されているのがわかります。

<img width="512" alt="20151012203721.png" src="https://qiita-image-store.s3.amazonaws.com/0/36518/d05da22f-b829-1861-d4c0-48792c2a985c.png">


# おわりに（どっちがいいの？）

`~/.ssh/config` の設定の煩雑さを考えると、個人的には https の方がお手軽かなと思いました。
サブアカウントが 1 個ならこの作業も一回きりだし変わらない、と考えることもできますが、
SSH では使用するアカウントによって git clone するときの URL を変えないといけないというのを忘れてしまいそうな気はします。

あと、どっちにしても最初に user.name, user.email を設定しなければいけないのはどうにかならないものか。。。
何かいい方法をご存知の方がいればご教示いただきたいです。

セキュリティの観点でどっちが優れているのかとかはわかりません（スミマセン）。

ちなみに、Heroku の CLI である [Heroku Toolbelt](https://toolbelt.heroku.com/) だとデフォルトは https になってるようですね。
ref. https://devcenter.heroku.com/articles/git#ssh-git-transport

> The default Git transport configured by Heroku toolbelt is HTTP, but SSH transport is also supported. 

### **追記(2016/01/13)**

GitHub でも https が推奨されてますね。

![SS 2016-01-13 19.02.01.png](https://qiita-image-store.s3.amazonaws.com/0/36518/4f523363-2e39-ce34-ef1a-8fdda27cda62.png)