dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

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

会社の PC を使っていると、普段は会社用の GitHub アカウントで作業をするが
ちょっとしたコードなどをたまに個人の GitHub リポジトリに保存したい時があり、その時はコミットも個人のアカウントで行いたい。
そういった感じで1台の PC で複数の GitHub アカウントを切り替えて使うための設定手順。

SSH を使った方法はググると記事がいくつか見つかるんだけど https の方はなかったのでメモ。

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

TL;DR

  1. SSH の場合
  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 を使った方法

以下のサイトを参考にさせていただいた。
同一端末で、複数のGitHubアカウントを使い分ける方法 · youkinjoh/TrainingWebSocket Wiki · GitHub

また、上記のサイトで省略しているSSH鍵の生成についてはこちらを参考にさせていただいた。
GitHubで複数のアカウントを使う場合のSSHの設定 - Qiita

サブアカウント用の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 が便利 - Qiita

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

Title は自分が識別しやすい名前ならなんでも良い。

f:id:dackdive:20151011173413p:plain こんな感じ。


~/.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 するだけでサブアカウントが使える。

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

f:id:dackdive:20151012034809p:plain


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 が表示されるのでコピーすると良い。

f:id:dackdive:20151012204634p:plain


サブアカウントを使用したいリポジトリで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 に保存する手順については以下の公式ドキュメントを参考にする。
Caching your GitHub credentials in Git - GitHub Docs

ここでは、私が使用している PC が Mac なので Mac でのやり方を記載するが
WindowsLinux でも可能らしい。

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

f:id:dackdive:20151012203721p:plain


おわりに(どっちがいいんだろう?)

~/.ssh/config の設定の煩雑さを考えると、個人的には https の方がお手軽かなと思った。
サブアカウントが 1 個ならこの作業も一回きりだし、、、と考えることもできるけど、
どっちのアカウント使うかで 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 が推奨されているよう。

f:id:dackdive:20160113193456p:plain