Edited at
GitDay 14

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

More than 3 years have passed since last update.


はじめに

1台のPCで複数のGitHubアカウントを使い分けたくなるシーンがたびたびあります。

たとえば会社のPCを使っている時に、自分のプライベートなリポジトリにちょっとしたコードをコミットするときなど。

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

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

両方試してみたところhttpsの方がお手軽な感じがしたので

せっかくなので2つの設定方法をメモしておきます。

※ 元々は自身のブログにも投稿していた内容なんですが、どちらがオススメなのか皆さんからも意見を伺いたいと思い投稿しました。

1台のPCで複数のGitHubアカウントを使う(SSHとhttps) - dackdive's blog


前提

メインで使うアカウントについては

すでに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鍵を作成します。この時、既存の鍵を上書きしてしまわないように注意。

$ 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 が便利

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


~/.ssh/config を編集する

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

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 clonegit remote add でリポジトリを指定する際、

$ 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 に置き換えます。

$ 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


2. https を使った方法


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

SSH の時は git clonegit remote add する際、git@... で始まる形式の URL でリポジトリを指定しましたが

https を使った方法では https://github.com... で始まる形式の URL で clone や remote add します。

$ 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


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

SSH の時と同様なので省略。

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


認証情報を PC に保存する

この状態でコミットを push すると GitHub のアカウント名とパスワードを尋ねられるので

サブアカウント用の情報を入力すれば push することはできます。

$ 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。

$ git credential-osxkeychain

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

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

$ git config --global credential.helper osxkeychain

なお、私はインストール済みだったので以下は未確認ですが、

コマンドが認識されなかった場合は curl でインストールする必要があるようです。

$ 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 を確認するとアカウント情報が保存されているのがわかります。

20151012203721.png


おわりに(どっちがいいの?)

~/.ssh/config の設定の煩雑さを考えると、個人的には https の方がお手軽かなと思いました。

サブアカウントが 1 個ならこの作業も一回きりだし変わらない、と考えることもできますが、

SSH では使用するアカウントによって git clone するときの URL を変えないといけないというのを忘れてしまいそうな気はします。

あと、どっちにしても最初に user.name, user.email を設定しなければいけないのはどうにかならないものか。。。

何かいい方法をご存知の方がいればご教示いただきたいです。

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

ちなみに、Heroku の CLI である Heroku Toolbelt だとデフォルトは 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