🔑

1台のMacで複数のGitHubアカウントを自動で使い分ける方法

に公開2

はじめに

「仕事や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にログインし、以下の手順で登録します。

  1. [Settings] > [SSH adn GPG keys] に移動します。
  2. [New SSH key] ボタンをクリックします。
  3. [Title] に、どのデバイスの鍵か識別できる名前(例:MacBook Air)を入力します。
  4. [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-hobbygithub.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の場合、メールアドレスも全世界に公開されてしまい、スパムメールが増える原因になりかねません。そのため、メールアドレスを非公開に設定することを強く推奨します。

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"

おわりに

この設定を行うことで、アカウントの切り替えミスによる意図しないコミットを防ぎ、複数アカウントをストレスなく安全に管理できます。一度設定してしまえば、あとはディレクトリ構造を意識するだけで済むので非常に快適です。ぜひ試してみてください!

Discussion

YuneKichiYuneKichi

url.<base>.insteadOfが使えそうですね。

~/.gitconfig_hobby

[url "git@github.com-hobby"]
    insteadOf = git@github.com

と書いて~/projects/hobby/以下でgit@github.com:~~のURLを使うと、gitが自動的にgit@github.com-hobby:~~に置き換えてくれます。

  • .git/config内のURLはgit@github.com:~~のまま
  • git remote -vではgit@github.com-hobby:~~と表示
SlickieSlickie

YuneKichiさん

ありがとうございます!
非常に有益なご指摘です。

url.<base>.insteadOfを使うことで、git cloneする際にリポジトリのURL (git@github.com:)を、意識的にエイリアス (git@github.com-hobby:)へと書き換える手間がゼロになりますね。

何も気にせずクローンできる 」という点で、まさにこの記事で目指すシームレスな環境が実現できる、重要な設定だと感じました。

教えていただき、ありがとうございます!
(記事本体への追記も検討させていただきます。)