【GitHub】Windowsで複数アカウントを自動的に切り替えてcloneするまで【メモ】

GitHub
プライベートのアカウントと業務用のアカウントを設定して使い分けたい。僕に必要な情報が複数の記事に分散されていたので、まとめておきます






手順

既にプライベートのアカウントが設定済みとします。

  1. SSHファイルを作成してGitHubに追加
  2. シングルサインオン用にSSHファイルを認証
  3. .ssh/configに追記
  4. SSH接続テスト
  5. ディレクトリごとにユーザーを切り替えるようにする
  6. リポジトリをclone



1. SSHファイルを作成してGitHubに追加

SSHファイル作成

$ mkdir ~/.ssh/work
$ ssh-keygen -t rsa -b 4096 -C "work@example.com" -f ~/.ssh/work/id_rsa
$ Generating public/private rsa key pair.
$ Enter passphrase (empty for no passphrase):

パスワードは空でOK。

GitHubに追加

Setting » SSH and GPG keys」にアクセスして、New SSH key で公開鍵を追加。



2. シングルサインオン用にSSHファイルを認証

シングルサインオン(二段階認証)が必須になっている organization の場合、この状態で clone などを実行すると以下のようなエラーが出ます。

ERROR: The `kgl-websites' organization has enabled or enforced SAML SSO. To access
this repository, you must use the HTTPS remote with a personal access token
or SSH with an SSH key and passphrase
that has been authorized for this organization. Visit
https://docs.github.com/articles/authenticating-to-a-github-organization-with-saml-single-sign-on/ for more information.

fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.


これを回避するためには、設定したSSHキーに対してシングルサインオン認証済みにする必要があります。先ほどの「Setting » SSH and GPG keys」にアクセスして、認証したいSSHキーの Configure SSO をクリック。認証したいorganizationを選んで指示に従って認証を行えばOK。詳細は、エラーメッセージにあるページの中に記載されている以下のページにあります。

Authorizing an SSH key for use with SAML single sign-on – GitHub Enterprise Cloud Docs



3. .ssh/configに追記

現在、.ssh/config は以下のような記述がある状態だと思います。

Host github
 HostName github.com
 IdentityFile ~/.ssh/id_rsa
 User git

ここに業務用アカウントの設定を追記します。

Host github.work
 HostName github.com
 IdentityFile ~/.ssh/work/id_rsa
 User git

ホスト名は何でも良いのですが、Gitの都合でアンダーバーは避けてドットなどにしておいた方が良いそうです。



4. SSH接続テスト

元々の設定と、新しい設定それぞれで接続テスト。それぞれのユーザー名が返ってくればOKです。

$ ssh -T github
Hi ippei! You've successfully authenticated, but GitHub does not provide shell access

$ ssh -T github.work
Hi ippeiwork! You've successfully authenticated, but GitHub does not provide shell access



5. ディレクトリごとにユーザーを切り替えるようにする

gitの機能を使ってディレクトリごとにユーザを切り替えるようにします。

新しいファイル .gitconfig-workを作成

[user]
 name = ippeiwork
 email = work@example.com


.gitconfigに切り替え設定を追加

[includeIf "gitdir/i:E:/work/projects/"]
 path = ~/.gitconfig-work

/i を入れておくとパスの大文字小文字を区別しなくなります。おまじない代わりに。


動作確認

$ cd E:\private\projects
$ git config --show-origin --get user.email
file:C:/Users/hoge/.gitconfig     private@example.com

$ cd E:\work\projects
$ git init
$ git config --show-origin --get user.email
file:C:/Users/hoge/.gitconfig-work     work@example.com

注意:Git管理されていないディレクトリではincludeIfが動かない
git管理されていないディレクトリでは、デフォルトの設定が使われます。これからリポジトリをcloneするような空のディレクトリでユーザーを切り替えるには git init コマンドで .git ディレクトリを生成しておく必要があります。



6. リポジトリをclone

メインとサブとでcloneコマンドが変わります。

メインの場合

$ git clone git@github.com:sample/sample.git

サブの場合

$ git clone git@github.work:sample/sample.git


@以下に .ssh/config で設定した Host を記述します。それだけです。commit や push は変わりません。



まとめ

これで複数アカウントを使うことになっても大丈夫です。あとは開発するだけです。




参考サイト

GitHubで複数アカウントを使い分ける方法 – わくわくBank
Authorizing an SSH key for use with SAML single sign-on – GitHub Enterprise Cloud Docs