1台のMacで複数のGitHubアカウントを自動で使い分ける方法
更新履歴
-
2025/10/24:
url.<base>.insteadOfを活用した設定の完全自動化を反映し、記事全体を再構成 - 2025/10/20: 初版公開
はじめに
「仕事や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設定で自動化する
最後に、この記事のハイライトです。
~/projects/workディレクトリではAさん、~/projects/hobbyディレクトリではBさん、と言ったように、 ディレクトリを移動するだけでコミットの作者情報(user.name, user.email)を自動で切り替える 設定を行います。
これを実現するために、includeIfとinsteadOfという機能を使います。
1. 用途別のgitconfigファイルを作成する
まず、アカウントごとに作者情報を記述した設定ファイルを作成します。
viが苦手な方は、STEP3で用いたcode ~/.ssh/configのように普段お使いのテキストエディタでファイルを開いて編集してください。
# 1つ目のアカウント用の設定ファイルを作成
vi ~/.gitconfig_work
~/.gitconfig_workに以下を記述します。
[user]
name = Your Work Name
email = your_email@account1.com
同様に、2つ目のアカウント用の設定ファイルも作成します。
作者情報に加えて、URLを自動で書き換える設定も追記します。
# 2つ目のアカウント用の設定ファイルを作成
vi ~/.gitconfig_hobby
~/.gitconfig_hobbyに以下を記述します。
[user]
name = Your Hobby Name
email = your_email@account2.com
[url "git@github.com-hobby:"]
insteadOf = git@github.com:
[url "git@github.com-hobby:"] insteadOf = git@github.com:
この設定が「完全自動化」の鍵です。
このファイルが読み込まれているとき(つまり、 ~/projects/hobby 配下にいるとき)、Gitは git@github.com: で始まる全てのURLを、内部的に git@github.com-hobby: に置き換えて処理します。
これにより、STEP3で設定したホストエイリアスが自動的に適応され、hobby用のSSHキーが選択されます。
(おまけ)この時の設定次第で匿名に出来ます。
[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の場合、メールアドレスも全世界に公開されてしまい、スパムメールが増える原因になりかねません。そのため、メールアドレスを非公開に設定することを強く推奨します。
2. メインの.gitconfigで読み込む設定をする
最後に、メインの~/.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"
【STEP5】実際にリポジトリを操作する
設定が完了したので、これからはディレクトリを意識するだけでよくなります。
新しくリポジトリをクローンする場合
work 用でも hobby 用でも、 常に同じ標準のSSH URLを使ってクローンできます 。
# 1つ目のアカウントのリポジトリをクローンする場合
cd ~/projects/work/
git clone git@github.com:your-work-username/repository.git
# 2つ目のアカウントのリポジトリをクローンする場合
cd ~/projects/hobby/
git clone git@github.com:your-hobby-username/repository.git
~/projects/hobby/ ディレクトリ内で実行された git clone は、STEP4の設定によって自動的に hobby 用のSSHキーが使われます。
既存のリポジトリの接続先を変更する場合
この設定を行う前にクローンした既存のローカルリポジトリにも、設定は部分的に適用されます。
- 作者情報(user.name, email): ディレクトリを移動するだけで自動的に切り替わります。
- リモート接続(SSHキー): リモートURLの書き換えは行われないため、手動での設定が必要です。
既存のリポジトリで使うSSHキーを切り替えたい場合は、そのリポジトリのディレクトリ内で以下のコマンドを実行し、リモートURLを標準のものに設定し直してください。
# hobbyアカウント用の既存リポジトリに設定を適用する例
cd ~/projects/hobby/existing-repo
git remote set-url origin git@github.com:your-hobby-username/existing-repo.git
これにより、今後の git push や git pull で insteadOf の設定が有効になり、適切なSSHキーが使われるようになります。
おわりに
この設定を行うことで、アカウントの切り替えミスによる意図しないコミットを防ぎ、複数アカウントをストレスなく安全に管理できます。一度設定してしまえば、あとはディレクトリ構造を意識するだけで済むので非常に快適です。ぜひ試してみてください!
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:)へと書き換える手間がゼロになりますね。「 何も気にせずクローンできる 」という点で、まさにこの記事で目指すシームレスな環境が実現できる、重要な設定だと感じました。
教えていただき、ありがとうございます!
(記事本体への追記も検討させていただきます。)