1台のMacで複数のGitHubアカウントを自動で使い分ける方法
はじめに
「仕事やOSSで使う実名アカウント」と「趣味や学習で使う匿名アカウント」。
1台のMacでこの2つのGitHubアカウントを、安全かつストレスなく使い分けたいと思ったことはありませんか?
この記事では、SSHとGitの機能を活用して、ディレクトリごとに使うアカウントとコミット情報を自動で切り替えるためのベストプラクティスをご紹介します。
※この方法ではGitHubのコントリビューショングラフ(草)がアカウントごとに分散されます。
この記事で実現すること
-
~/projects/work
配下のディレクトリでは「1つ目のアカウント」を使用する -
~/projects/hobby
配下のディレクトリでは「2つ目のアカウント」を使用する - 上記ディレクトリに移動するだけで、コミットの作成情報(
user.name
,user.email
)も自動で切り替わる - (おまけ)コミットに登録するメールアドレスをプライベートに保つ
【STEP1】アカウントごとにSSHキーを作成する
まず、ターミナルを開いて各アカウント専用のSSHキーペア(秘密鍵と公開鍵)を作成します。
# 1つ目のアカウント用SSHキーを作成
# "your_email@account1.com" はご自身のメールアドレスに置き換えてください
ssh-keygen -t ed25519 -C "your_email@account1.com" -f ~/.ssh/id_ed25519_work
# 2つ目のアカウント用SSHキーを作成
# "your_email@account2.com" はご自身のメールアドレスに置き換えてください
ssh-keygen -t ed25519 -C "your_email@account2.com" -f ~/.ssh/id_ed25519_hobby
-f
オプションは、作成する鍵のファイル名を指定するものです。ここでは用途が分かりやすいように_work
と_hobby
という名前にしました。
このコマンドにより、以下の2つのファイルがペアで作成されます。
-
id_ed25519_work
(秘密鍵:絶対に他人に公開しない) -
id_ed25519_work.pub
(公開鍵:GitHubに登録するもの)
※_hobby
も同様に作成されます。
【STEP2】GitHubに公開鍵を登録する
作成した公開鍵(.pub
ファイル)の内容を、それぞれのGitHubアカウントに登録します。
1. 公開鍵をコピーする
以下のコマンドで、公開鍵の内容をクリップボードにコピーできます。
# 1つ目のアカウント用の公開鍵をコピー
pbcopy < ~/.ssh/id_ed25519_work.pub
# 2つ目のアカウント用の公開鍵をコピー
pbcopy < ~/.ssh/id_ed25519_hobby.pub
2. GitHubに登録する
書くアカウントでGitHubにログインし、以下の手順で登録します。
- [Settings] > [SSH adn GPG keys] に移動します。
- [New SSH key] ボタンをクリックします。
-
[Title] に、どのデバイスの鍵か識別できる名前(例:
MacBook Air
)を入力します。 - [key] に、先ほどコピーした公開鍵の内容を貼り付け、登録します。
必ず、アカウントと公開鍵のペアを間違えないように登録してください。
【STEP3】SSH設定でホストを振り分ける
次に、~/.ssh/config
ファイルを編集して、特定のホスト名でアクセスした際に使用するSSHキーを指定します。
# VSCodeでconfigファイルを開く例
code ~/.ssh/config
(ファイルが存在しない場合は、新しく作成してください)
以下の内容をconfig
ファイルに記述します。
# 1つ目のアカウント (デフォルト)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
# 2つ目のアカウント
Host github.com-hobby
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_hobby
IdentitiesOnly yes
-
Host github.com-hobby
のgithub.com-hobby
は2つ目のアカウント用の接続エイリアス(別名)です、自由に設定できます。 -
IdentitiesOnly yes
は、ここで指定した秘密鍵(IdentityFile
)のみを使って認証を試みるための設定です。
この設定により、GitのリモートURLに応じて使用するSSHキーが自動で選択されるようになります。
-
git@github.com:...
→id_ed25519_work
を使用 -
git@github.com-hobby:...
→id_ed25519_hobby
を使用
SSH接続を確認する(任意)
SSHが正しく設定されているか確認してみましょう。
任意ですが、~/.ssh/config
の設定ミスに早期に気付くことができます。
ターミナルで以下のコマンドを実行し、それぞれのアカウントで正しく認証できるか確認します。
# 1つ目のアカウントの接続テスト
ssh -T git@github.com
# Hi your-work-username! You've successfully authenticated... と表示されれば成功
# 2つ目のアカウントの接続テスト
ssh -T git@github.com-hobby
# Hi your-hobby-username! You've successfully authenticated... と表示されれば成功
【STEP4】GitリポジトリとSSHキーを紐付ける
リポジトリを扱う際に、STEP3で設定したホスト名を使い分けます。
新しくリポジトリをクローンする場合
# 1つ目のアカウントでクローン
git clone git@github.com:your-work-username/repository.git
# 2つ目のアカウントでクローン
git clone git@github.com-hobby:your-hobby-username/repository.git
既存のリポジトリの接続先を変更する場合
# 1つ目のアカウント用に変更
git remote set-url origin git@github.com:your-work-username/repository.git
# 2つ目のアカウント用に変更
git remote set-url origin git@github.com-hobby:your-hobby-username/repository.git
これで、リポジトリとGitHubアカウントの設定は完了です。
【STEP5】ディレクトリごとにGitの作者情報を自動で切り替える
最後に、この記事のハイライトです。
~/projects/work
ディレクトリではAさん、~/projects/hobby
ディレクトリではBさん、と言ったように、 ディレクトリを移動するだけでコミットの作者情報(user.name
, user.email
)を自動で切り替える 設定を行います。
これを実現するために、Git2.13から導入されたIncludeIf
という機能を使います。
1. 用途別のgitconfigファイルを作成する
まず、アカウントごとに作者情報を記述した設定ファイルを作成します。
vi
が苦手な方は、STEP3で用いたcode ~/.ssh/config
のように普段お使いのテキストエディタでファイルを開いて編集してください。
# 1つ目のアカウント用の設定ファイルを作成
vi ~/.gitconfig_work
~/.gitconfig_work
に以下を記述します。
[user]
name = Your Work Name
email = your_email@account1.com
同様に、2つ目のアカウント用の設定ファイルも作成します。
(おまけ)この時の設定次第で匿名に出来ます。
[user]
name = Your Anonymous Name
email = XXXXXXXX+your-username@users.noreply.github.com
匿名用メールアドレスは以下の手順で取得できます。
GitHubの [Settings] > [Emails] を開き、 [Keep my email address private] にチェックを入れると表示されます。
なぜメールアドレスを非公開にするのか?
Gitでコミットを行うと、作者情報(
user.name
,user.email
)がコミット履歴に記録されます。
この履歴はリモートリポジトリへプッシュすると、そのリポジトリにアクセスできる人は誰でも閲覧できてしまいます。特にリポジトリがPublicの場合、メールアドレスも全世界に公開されてしまい、スパムメールが増える原因になりかねません。そのため、メールアドレスを非公開に設定することを強く推奨します。
.gitconfig
で読み込む設定をする
2. メインの最後に、メインの~/.gitconfig
ファイルに、特定のディレクトリパスの場合に先ほど作成したファイルを読み込むよう記述します。
vi ~/.gitconfig
ファイルの末尾には以下の設定を追加してください。
# --- ディレクトリごとの設定切り替え ---
[includeIf "gitdir:~/projects/work/"]
path = ~/.gitconfig_work
[includeIf "gitdir:~/projects/hobby/"]
path = ~/.gitconfig_hobby
(~/projects/work/
の最後の/
を忘れないように注意してください)
これで全ての設定は完了です!
設定の確認方法
設定が正しく反映されているか確認してみましょう。
ターミナルで各ディレクトリに移動し、以下のコマンドを実行します。(プロジェクトのリポジトリが存在している前提です。)
# workディレクトリに移動
cd ~/projects/work/some-repo
# 作者情報を確認
git config user.name
# => Your Work Name と表示されるはず
git config user.email
# => your_email@account1.com と表示されるはず
指定したディレクトリ配下のリポジトリであれば、どこでも設定が自動で切り替わることが確認できるはずです。
重要:既存のリポジトリには自動で適応されません
このIncludeIf
による作者情報の自動切り替えは、 この設定を行った後にgit clone
した新しいリポジトリで有効 になります。
既に存在しているローカルリポジトリには、この設定は反映されません。既存のリポジトリで作者情報を変更したい場合は、そのリポジトリのディレクトリ内で以下のコマンドを手動で設定してください。
git config user.name "Your Name"
git config user.email "your_email@account.com"
おわりに
この設定を行うことで、アカウントの切り替えミスによる意図しないコミットを防ぎ、複数アカウントをストレスなく安全に管理できます。一度設定してしまえば、あとはディレクトリ構造を意識するだけで済むので非常に快適です。ぜひ試してみてください!
Discussion
url.<base>.insteadOf
が使えそうですね。~/.gitconfig_hobby
にと書いて
~/projects/hobby/
以下でgit@github.com:~~
のURLを使うと、gitが自動的にgit@github.com-hobby:~~
に置き換えてくれます。.git/config
内のURLはgit@github.com:~~
のままgit remote -v
ではgit@github.com-hobby:~~
と表示YuneKichiさん
ありがとうございます!
非常に有益なご指摘です。
url.<base>.insteadOf
を使うことで、git clone
する際にリポジトリのURL(git@github.com:)
を、意識的にエイリアス(git@github.com-hobby:)
へと書き換える手間がゼロになりますね。「 何も気にせずクローンできる 」という点で、まさにこの記事で目指すシームレスな環境が実現できる、重要な設定だと感じました。
教えていただき、ありがとうございます!
(記事本体への追記も検討させていただきます。)