会社の PC を使っていると、普段は会社用の GitHub アカウントで作業をするが
ちょっとしたコードなどをたまに個人の GitHub リポジトリに保存したい時があり、その時はコミットも個人のアカウントで行いたい。
そういった感じで1台の PC で複数の GitHub アカウントを切り替えて使うための設定手順。
SSH を使った方法はググると記事がいくつか見つかるんだけど https の方はなかったのでメモ。
前提として、メインで使うアカウントについては
すでにSSH鍵の登録や git config --global
でユーザー名、メールアドレスなどの設定が済んでいるものとします。
TL;DR
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 は自分が識別しやすい名前ならなんでも良い。
こんな感じ。
~/.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 するだけでサブアカウントが使える。
余談だが、ユーザー名はちゃんとサブアカウントのものなのにアイコンが表示されない場合は 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 に保存する手順については以下の公式ドキュメントを参考にする。
Caching your GitHub credentials in Git - GitHub Docs
ここでは、私が使用している 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 個ならこの作業も一回きりだし、、、と考えることもできるけど、
どっちのアカウント使うかで 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 が推奨されているよう。