前提・目的
GitHub (または Bitbucket) に複数アカウントを所有しており、接続にはSSHを用いている。接続アカウントを状況により切り替えたい。
※複数アカウントを運用する際には GitHub, Bitbucket の利用規約周りをちゃんと読んでおいたほうが良いと思う。僕自身には規約周りを人に説明できるほどの言葉が無いため、そのあたりの解説は本記事では行わない。
概要
- 接続アカウントを切り替えたい。
- git config で変わるのはコミット時Authorのみ。認証には関係ない。
- 認証を切り替えるためには、SSH鍵の切替が必要。
- 普段使っている鍵を書き換えるわけにはいかないので、別の鍵を作り、設定を行う。
git config について
コミット時のAuthorを切り替えるために、ローカルのリポジトリ内で以下を行っておこう。
$ git config user.name "名前" $ git config user.email "メール"
ただしこれはサーバ接続時の認証には関係しないことに注意する。あくまでもコミット記録用である。
では何を以てアカウントの判別・認証を行っているのか
Git におけるSSH認証において git config はオマケである。あれのユーザ名とかメールアドレスはあくまでも自己申告であり、認証に使われるものではない。
認証に使われるのはSSH鍵である。
鍵があればアカウントが識別される
確認してみよう。
公開鍵の確認
普段 GitHub, BitBucket をSSH接続で使っているのであれば、鍵ファイルがあり、それが GitHub, Bitbucket 側にも登録されているはず。
$ cat .ssh/id_rsa.pub ssh-rsa AAAA…JJbQ== ← これが既にアカウントのSSH鍵設定に追加されているはず。
SSH接続してみる
あまり意識してないかもしれないが、そもそもSSH接続の際に指定しているのは、自分のアカウント名ではなく「git」なのである。
だが、実際に接続してみると、
$ ssh git@github.com Hi kobake! … $ ssh git@bitbucket.org logged in as kobake. …
自分のアカウント名が含まれた応答メッセージが返ってくることから、正しくアカウント識別が行われていることが分かる。
上記で接続時に指定したのは以下のパラメータである。
- ユーザ名 … "git"
- ホスト名 … "github.com" (または "bitbucket.org")
さらに、明示的に指定しているわけではないけど、暗黙に送られているパラメータが以下である。
公開鍵が送られているおかげで、gitサーバ側ではアカウントを識別することができる。(もちろん識別に加えて認証も行われる。その際には公開鍵に加えて秘密鍵も用いられる)
さて、アカウントを切り替えたいが。
以上のような理屈でアカウントが識別されているため、アカウントを切り替えるためにはつまり、端的にいうと、SSH鍵の切替が必要になる。
が、このSSH鍵、基本的に ~/.ssh/id_rsa.pub (および ~/.ssh/id_rsa) として置きっぱなしであり、普通は一度作った後に書き換えることはしないものであり、下手にこれをいじくると後々問題が起きかねない。
複数鍵を用意して切り替える
そんなわけで、以下の手順を踏むと良い。
- (1) 新しくSSH鍵を作成する
- (2) サーバ (GitHub または Bitbucket) 側の目的のアカウントに(1)の鍵を登録しておく
- (3) 接続先の別名を作る。別名への接続の際には(1)の鍵を参照するようにする
(1) 新しくSSH鍵を作成する
hogekey という名前で作ることにする。
$ ssh-keygen -t rsa -f ~/.ssh/hogekey -C "適当なコメント" Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): (そのままEnter) Enter same passphrase again: (そのままEnter)
(2) サーバ (GitHub または Bitbucket) 側の目的のアカウントに(1)の鍵を登録しておく
新しい公開鍵の内容をコピーし、
$ cat .ssh/hogekey.pub ssh-rsa AAAA…J6lw== ← 実際にはもっと長い文字列。これをコピー
サーバ (GitHub または Bitbucket) 側にSSH鍵を登録(ペースト)する。
- GitHub であれば https://github.com/settings/ssh から。
- Bitbucket であれば https://bitbucket.org/account/user/アカウント名/ssh-keys/ から。
(3) 接続先の別名を作る。別名への接続の際には(1)の鍵を参照するようにする
~/.ssh/config を編集する
Host hogehub ← 追記 HostName github.com ← 追記 IdentityFile ~/.ssh/hogekey ← 追記 Host hogebucket ← 追記 HostName bitbucket.org ← 追記 IdentityFile ~/.ssh/hogekey ← 追記
こうすると、SSH 接続先として hogehub という名前が有効になる。「ssh git@hogehub」のように接続しようとすると、実際には github.com に対して接続が試みられる。また、その際に利用されるSSH鍵は id_rsa ではなく hogekey のほうになる。(hogebucket についても同様)
Git からの利用
~/.ssh/config で設定された接続先の別名は、Git からも認識される。
状況に応じて clone なり remote add なり remote set-url なりすれば良い。
clone
$ git clone git@hogehub:アカウント/リポジトリ.git
remote add
$ git remote add origin git@hogehub:アカウント/リポジトリ.git
remote set-url
$ git remote set-url origin git@hogehub:アカウント/リポジトリ.git
等々
後は好きに利用すれば良いと思う。