はじめに
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 clone
や git 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
が間違ってる可能性あり)
2. https を使った方法
サブアカウントを使用したいリポジトリで https://github.com...
を使う
SSH の時は git clone
や git 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 が表示されるのでコピーすると良いです。
サブアカウントを使用したいリポジトリで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 を確認するとアカウント情報が保存されているのがわかります。
おわりに(どっちがいいの?)
~/.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 が推奨されてますね。