Git Configの「分身」術:ディレクトリごとにEmailとSSHキーを自動で切り替える方法

Git tutorial - IT technology blog
Git tutorial - IT technology blog

「Identityの間間違い」という悪夢

会社のプロジェクトに、うっかり個人のメールアドレスでコードをコミットしてしまい、恥ずかしい思いをしたことがある方は多いのではないでしょうか。その結果、コントリビューションのグラフに全く見覚えのない名前が表示されてしまいます。そうなると、何十ものコミットを git commit --amend で修正する羽目になり、非常に時間がかかる上にコンフリクトの原因にもなりかねません。

この問題は、1台のPCを仕事、フリーランスのプロジェクト、オープンソース活動で共用している場合に非常によく起こります。新しいリポジトリをクローンするたびに手動で git config user.email を入力するのは手間がかかりますし、忘れがちです。一瞬の不注意で、Gitの履歴が「公」と「私」の混ざり合ったカオスな状態になってしまいます。

ミスを後から修正するのではなく、Gitの includeIf 機能を使ってこの作業を自動化しましょう。これは、私が20以上の異なるプロジェクトを管理しながら、一度もIdentityを間違えることなく運用している方法です。

5分で完了する自動設定

まず、以下のようなディレクトリ構造で仕事を整理していると仮定します:

  • ~/work/: 会社の全プロジェクト(SaaS、受託開発など)。
  • ~/personal/: 個人プロジェクトや学習用のリポジトリ。

ステップ1:個別の設定ファイルを作成する

まず、環境ごとに設定を切り出します。ホームディレクトリ(~)に .gitconfig-work ファイルを作成します:

# ~/.gitconfig-work
[user]
    name = Nguyen Van A (Work)
    email = [email protected]

同様に、個人プロジェクト用の .gitconfig-personal ファイルを作成します:

# ~/.gitconfig-personal
[user]
    name = DevCute9x
    email = [email protected]

ステップ2:メイン設定でincludeIfを有効にする

メインの ~/.gitconfig ファイルを開き、末尾に以下のコードを追加します。ここが魔法の核心です:

# ~/.gitconfig
[user]
    name = Default Name
    email = [email protected]

# workディレクトリ内にいる場合に設定を自動読み込み
[includeIf "gitdir:~/work/"]
    path = ~/.gitconfig-work

# personalディレクトリ内にいる場合に設定を自動読み込み
[includeIf "gitdir:~/personal/"]
    path = ~/.gitconfig-personal

重要なポイント: ディレクトリパスの最後には必ずスラッシュ / を含める必要があります。これがないと、Gitはそれがルートディレクトリであることを認識できず、この機能が動作しません。

includeIfの動作仕組み

Gitは「上書き(override)」の原則に基づいて動作します。Gitコマンドを実行すると、まずグローバルの .gitconfig ファイルが読み込まれます。次に、現在のディレクトリが gitdir の条件に一致するかどうかをチェックします。一致した場合、Gitは path で指定されたファイルから追加の設定を読み込み、古い値を上書きします。

このアプローチを採用すると、ディレクトリを整理整頓せざるを得なくなります。~/work/ 内のどのリポジトリに cd しても、Gitは自動的にあなたを会社の従業員として認識します。~/personal/ に移動すれば、すぐに個人のIdentityに戻ります。

応用テクニック:SSHキーの自動切り替え

Emailの変更だけでは、見た目の問題が解決したに過ぎません。本当に厄介なのは認証(authentication)の問題です。会社で専用のSSHキーを使う Gitlabを利用し、個人では別のキーを使うGitHubを利用している場合、通常は ~/.ssh/config を複雑に設定する必要があります。

よりスマートな方法があります。個別の設定ファイル内で core.sshCommand を直接使用する方法です。

~/.gitconfig-work ファイルを以下のように更新します:

[user]
    name = Nguyen Van A (Work)
    email = [email protected]
[core]
    sshCommand = "ssh -i ~/.ssh/id_rsa_work -o IdentitiesOnly=yes"

work/ ディレクトリ内で git push を行うと、Gitは自動的に仕事用の正しいSSHキーを使用します。ssh-add でキーを間違えたり、誤った証明書でアクセス拒否されたりすることを心配する必要はもうありません。

「現場」からの実践的なアドバイス

長年この方法を運用してきた中で、トラブルを避けるための3つの重要な注意点を挙げます:

  1. コマンドで確認する: 推測に頼らず、新しいディレクトリに入ったらすぐに git config user.email を入力して、Gitが正しいIdentityを認識しているか確認しましょう。
  2. Windowsでの使用: Windows OSでは、大文字と小文字が区別されないことがあります。パスによるエラーを避けるために、gitdir: の代わりに gitdir/i: を使用することをお勧めします(例:[includeIf "gitdir/i:C:/Work/"])。
  3. 優先順位: 後からインクルードされたファイルが最も高い優先権を持ちます。共通の設定はメインファイルに、特定の環境固有の設定は子ファイルに記述するようにしましょう。

環境を分離することで、同僚からもよりプロフェッショナルに見えるでしょう。何より、些細な管理作業から脳を解放し、最も重要な「コードを書くこと」に集中できるようになります。

Share: