Skip to content

Latest commit

 

History

History
590 lines (428 loc) · 30.4 KB

File metadata and controls

590 lines (428 loc) · 30.4 KB

Git ID Switcher

Git ID Switcher ワンクリックで複数のGitプロフィールを切り替え。複数のGitHubアカウント、SSH鍵、GPG署名を管理し、Gitサブモジュールにも自動的にプロフィールを適用します。

Open VSX Registry License: MIT OpenSSF Scorecard OpenSSF Best Practices SLSA 3 Sigstore SBOM Security CI Platform codecov Quality Gate Status Snyk monitored Gitleaks Harden-Runner Karesansui Architecture
26 Languages 🇺🇸 🇯🇵 🇨🇳 🇹🇼 🇰🇷 🇩🇪 🇫🇷 🇪🇸 🇧🇷 🇮🇹 🇷🇺 🇵🇱 🇹🇷 🇨🇿 🇭🇺 🇧🇬 🇺🇦 🌍 🌺 🐻 🐉 🖖 🐱 🏴‍☠️ 🎭

デモ

🎯 なぜ Git ID Switcher?

Gitプロフィール切り替えツールは数多く存在しますが、Git ID Switcherは他のツールが見落としがちな複雑な問題を解決します:

  1. サブモジュールの悩み: サブモジュールを持つリポジトリ(例:Hugoテーマ、ベンダーライブラリ)で作業する際、通常はサブモジュールに対してgit config user.nameを手動で設定する必要があります。この拡張機能は、すべてのアクティブなサブモジュールに再帰的にプロフィールを適用することで、これをエレガントに解決します。
  2. SSH & GPGの処理: 単に名前を変更するだけでなく、ssh-agent内のSSH鍵を入れ替え、GPG署名を設定するため、間違った署名でコミットすることを防ぎます。

機能

  • プロフィール管理UI: settings.jsonを編集せずに、プロフィールの追加・編集・削除・並べ替えが可能
  • ワンクリックでプロフィール切り替え: Git user.nameとuser.emailを瞬時に変更
  • ステータスバー統合: 現在のプロフィールを常に一目で確認
  • 同期チェック: プロフィールとgit configの不一致をリアルタイム検出し、ステータスバーで警告
  • サブモジュール対応: Gitサブモジュールにも自動的にプロフィールを伝播
  • SSH鍵管理: ssh-agentのSSH鍵を自動的に切り替え
  • GPG署名対応: コミット署名用のGPG鍵を設定(オプション)
  • リッチなツールチップ: 説明やSSHホストを含む詳細なプロフィール情報
  • クロスプラットフォーム: macOS、Linux、Windowsで動作
  • 多言語対応: 17言語をサポート

🌏 多言語への想い

私は少数派の存在価値を大切にしています。 少数だからといって切り捨てたくないのです。 完璧に翻訳できなくても、少数言語の存在を理解し、敬意を示す意図だけでも感じていただければと思っています。

この拡張機能は、VS Codeがサポートする17言語すべてに対応しています。さらに、READMEドキュメントについては、少数民族の言語やジョーク言語への翻訳にもチャレンジしています。

これはただの「グローバル対応」ではなく、「言語的多様性への敬意」です。そして、言語を超えて、あらゆる場所に住む開発者から世界が良くなるコミットがされていく...そんなインフラになったら嬉しいです。


クイックスタート

個人アカウントと会社発行アカウント(Enterprise Managed User)を使い分ける典型的なセットアップです。

ステップ 1: SSH鍵を準備

まず、アカウントごとにSSH鍵を作成します(すでにある場合はスキップ):

# 個人用
ssh-keygen -t ed25519 -C "kaoru@personal.example.com" -f ~/.ssh/id_ed25519_personal

# 仕事用
ssh-keygen -t ed25519 -C "kaoru.takahashi@techcorp.example.com" -f ~/.ssh/id_ed25519_work

各SSH鍵の公開鍵.pubファイル)をそれぞれのGitHubアカウントに登録してください。

注意: GitHubに登録するのは id_ed25519_personal.pub(公開鍵)です。id_ed25519_personal(拡張子なし)は秘密鍵なので、絶対に他人と共有したりアップロードしないでください。

ステップ 2: SSH configを設定

~/.ssh/config を編集:

# 個人用GitHubアカウント(デフォルト)
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_personal
    IdentitiesOnly yes

# 仕事用GitHubアカウント
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes

ステップ 3: 拡張機能を設定

インストール直後はサンプルプロフィールが用意されています。 以下のガイドに沿って、これを自分用に編集しましょう。

初回セットアップ手順(13ステップ):ステータスバーからプロフィール管理を開き、編集・新規作成を行う流れ

鍵ファイルは送信されません: SSH鍵パスの設定で記録されるのは鍵ファイルのパス(場所)だけです。鍵ファイルの中身がアップロードされたり外部に送信されることはありません。

GPG署名を使う場合: プロフィール編集画面で gpgKeyId も設定できます。 GPG鍵IDの確認方法は「トラブルシューティング」を参照してください。

ヒント: settings.jsonから直接設定することもできます。 拡張機能の設定を開き(Cmd+, / Ctrl+,)→「Git ID Switcher」を検索 →「settings.jsonで編集」をクリック。 JSON形式での設定例は「フル設定例」を参照してください。


フル設定例: 5アカウントとSSH + GPG

すべてを組み合わせた完全な例:

SSH設定 (~/.ssh/config)

# 個人用アカウント(デフォルト)
Host github-personal
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_personal
    IdentitiesOnly yes

# 仕事用アカウント(会社発行のEnterprise Managed User)
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes

# クライアントA 受託開発(Bitbucket)
Host bitbucket-clienta
    HostName bitbucket.org
    User git
    IdentityFile ~/.ssh/id_ed25519_clienta
    IdentitiesOnly yes

# クライアントB 常駐プロジェクト(Bitbucket)
Host bitbucket-clientb
    HostName bitbucket.org
    User git
    IdentityFile ~/.ssh/id_ed25519_clientb
    IdentitiesOnly yes

# OSS活動(GitLab)
Host gitlab-oss
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/id_ed25519_oss
    IdentitiesOnly yes

拡張機能の設定

{
  "gitIdSwitcher.identities": [
    {
      "id": "personal",
      "name": "高橋カオル",
      "email": "kaoru@personal.example.com",
      "service": "GitHub",
      "icon": "🏠",
      "description": "個人プロジェクト",
      "sshKeyPath": "~/.ssh/id_ed25519_personal",
      "sshHost": "github-personal",
      "gpgKeyId": "ABCD1234EF567890"
    },
    {
      "id": "work-main",
      "name": "高橋カオル",
      "email": "kaoru.takahashi@techcorp.example.com",
      "service": "GitHub 会社用",
      "icon": "💼",
      "description": "TechCorp 本業",
      "sshKeyPath": "~/.ssh/id_ed25519_work",
      "sshHost": "github-work",
      "gpgKeyId": "9876543210FEDCBA"
    },
    {
      "id": "client-a",
      "name": "高橋カオル",
      "email": "kaoru@clienta.example.com",
      "service": "Bitbucket",
      "icon": "🏢",
      "description": "ClientA社 受託案件",
      "sshKeyPath": "~/.ssh/id_ed25519_clienta",
      "sshHost": "bitbucket-clienta"
    },
    {
      "id": "client-b",
      "name": "K.Takahashi",
      "email": "k.takahashi@clientb.example.com",
      "service": "Bitbucket",
      "icon": "🏭",
      "description": "ClientB社 常駐案件",
      "sshKeyPath": "~/.ssh/id_ed25519_clientb",
      "sshHost": "bitbucket-clientb"
    },
    {
      "id": "oss",
      "name": "kaoru-dev",
      "email": "kaoru.dev@example.com",
      "service": "GitLab",
      "icon": "🌟",
      "description": "OSSコントリビューション",
      "sshKeyPath": "~/.ssh/id_ed25519_oss",
      "sshHost": "gitlab-oss"
    }
  ],
  "gitIdSwitcher.defaultIdentity": "personal",
  "gitIdSwitcher.autoSwitchSshKey": true,
  "gitIdSwitcher.applyToSubmodules": true
}

注意:4番目のプロフィール(client-b)は省略名、5番目(oss)はハンドルネームを使用しています。同じ人物でもプロフィールごとに異なる表示名を設定できます。


プロフィール管理

ステータスバーをクリック → 一覧下部の「プロフィール管理」で管理画面を開きます。 プロフィールの追加・編集・削除・並び替えはすべてUIから直接操作できます。

プロフィール管理:削除・並べ替えの操作ガイド

コマンドパレットから Git ID Switcher: Delete Identity でプロフィールを削除することもできます。


コマンド

コマンド 説明
Git ID Switcher: Select Identity プロフィールピッカーを開く
Git ID Switcher: Delete Identity プロフィールを削除
Git ID Switcher: Show Current Identity 現在のプロフィール情報を表示
Git ID Switcher: Show Documentation ドキュメントを表示

設定リファレンス

プロフィールのプロパティ

プロパティ 必須 説明
id 一意の識別子(例:"personal", "work"
name Git user.name - コミットに表示
email Git user.email - コミットに表示
icon ステータスバーに表示される絵文字(例:"🏠")。単一の絵文字のみ
service サービス名(例:"GitHub", "GitLab")。UI表示に使用
description ピッカーとツールチップに表示される短い説明
sshKeyPath SSHプライベートキーへのパス(例:"~/.ssh/id_ed25519_work"
sshHost SSH configのHostエイリアス(例:"github-work"
gpgKeyId コミット署名用のGPG鍵ID

表示に関する制限

  • ステータスバー: 約25文字を超える場合は ... で省略されます
  • icon: 単一の絵文字(書記素クラスター)のみ使用可能。複数の絵文字や長い文字列は使用できません

グローバル設定

設定 デフォルト 説明
gitIdSwitcher.identities サンプル参照 プロフィール設定のリスト
gitIdSwitcher.defaultIdentity サンプル参照 使用するデフォルトプロフィールのID
gitIdSwitcher.autoSwitchSshKey true プロフィール変更時にSSH鍵を自動切り替え
gitIdSwitcher.showNotifications true プロフィール切り替え時に通知を表示
gitIdSwitcher.applyToSubmodules true Gitサブモジュールにプロフィールを伝播
gitIdSwitcher.submoduleDepth 1 ネストされたサブモジュール設定の最大深度(1-5)
gitIdSwitcher.includeIconInGitConfig false アイコン絵文字をGit configのuser.nameに含めるか
gitIdSwitcher.syncCheck.enabled true プロフィールとgit configの同期チェックを有効にする
gitIdSwitcher.syncCheck.onFocusReturn true ウィンドウフォーカス復帰時に同期チェックを実行する
gitIdSwitcher.logging.fileEnabled false 監査ログをファイルに保存する(ID切り替え、SSH鍵操作などを記録)
gitIdSwitcher.logging.filePath "" ログファイルのパス(例:~/.git-id-switcher/security.log)。空文字列の場合はデフォルトパスを使用
gitIdSwitcher.logging.maxFileSize 10485760 ローテーション前の最大ファイルサイズ(バイト単位、1MB-100MB)
gitIdSwitcher.logging.maxFiles 5 保持するローテーションファイルの最大数(1-20)
gitIdSwitcher.logging.redactAllSensitive false 有効にすると、ログ内の全ての値をマスクします(最大プライバシーモード)
gitIdSwitcher.logging.level "INFO" ログの詳細度(DEBUG, INFO, WARN, ERROR, SECURITY)。選択したレベル以上を記録
gitIdSwitcher.commandTimeouts {} コマンドごとのカスタムタイムアウト値(ミリ秒単位、1秒-5分)。例:{"git": 15000, "ssh-add": 10000}

includeIconInGitConfig について

icon フィールドを設定した場合の動作を制御します:

動作
false(デフォルト) iconはエディタUIのみに表示。Git configにはnameのみ書き込み
true Git configにicon + nameを書き込み。コミット履歴にも絵文字が残る

例:icon: "👤", name: "高橋カオル" の場合

includeIconInGitConfig Git config user.name コミット署名
false 高橋カオル 高橋カオル <email>
true 👤 高橋カオル 👤 高橋カオル <email>

仕組み

Git configのレイヤー構造

Gitの設定には3つのレイヤーがあり、下位の設定を上位が上書きします:

システム (/etc/gitconfig)
    ↓ 上書き
グローバル (~/.gitconfig)
    ↓ 上書き
ローカル (.git/config)  ← 最優先

Git ID Switcherは --local(リポジトリローカル)に書き込みます。

つまり:

  • 各リポジトリの .git/config にプロフィールを保存します
  • リポジトリごとに異なるプロフィールを維持できます
  • グローバル設定(~/.gitconfig)は変更しません

プロフィール切り替え時の動作

プロフィールを切り替えると、拡張機能は以下を(順番に)実行します:

  1. Git Config(常時): git config --local user.nameuser.emailを設定
  2. SSH鍵sshKeyPath設定時): 他の鍵をssh-agentから削除し、選択した鍵を追加
  3. GPG鍵gpgKeyId設定時): git config --local user.signingkeyを設定し、署名を有効化
  4. サブモジュール(有効時): すべてのサブモジュールに設定を伝播(デフォルト:深度1)
  5. 同期チェック: 適用したプロフィールとgit configが一致しているか自動検証

同期チェック

選択中のプロフィールと実際の git config --local の値(user.name, user.email, user.signingkey)を比較し、不一致があればステータスバーに警告を表示します。

チェックのタイミング:

  • プロフィール適用直後
  • ワークスペースフォルダ変更時
  • 設定変更時
  • エディタウィンドウへのフォーカス復帰時(デバウンス500ms)

不一致が検出された場合:

  • ステータスバーに ⚠️ が表示され、背景が警告色に変わります
  • ツールチップに不一致の詳細(項目・期待値・実際の値)がテーブル形式で表示されます
  • クリックすると解決方法の選択肢が表示されます:
    • プロフィールを再適用 — 現在のプロフィールをgit configに再適用
    • 別のプロフィールを選択 — プロフィールピッカーを開く
    • 無視 — 次回のチェックまで警告を抑制

無効化するには:

gitIdSwitcher.syncCheck.enabledfalse に設定すると、すべての同期チェックが無効になります。 フォーカス復帰時のチェックのみ無効にしたい場合は、gitIdSwitcher.syncCheck.onFocusReturnfalse に設定してください。

サブモジュール伝播の仕組み

ローカル設定はリポジトリ単位のため、サブモジュールには自動的に適用されません。 そのため、本拡張機能はサブモジュールへの伝播機能を提供しています(詳細は「上級者向け: サブモジュールサポート」を参照)。

SSH鍵管理の詳細

Git ID Switcherはssh-agentを通じてSSH鍵を管理します:

操作 実行コマンド
鍵を追加 ssh-add <keyPath>
鍵を削除 ssh-add -d <keyPath>
鍵の一覧 ssh-add -l

重要: この拡張機能は ~/.ssh/config変更しません。SSH configの設定は手動で行う必要があります(「クイックスタート」のステップ2を参照)。

既存のSSH設定との相互作用

すでにSSH設定がある場合、Git ID Switcherは以下のように動作します:

あなたの設定 Git ID Switcherの動作
~/.ssh/configIdentityFile を指定 両方が使用可能;IdentitiesOnly yes で競合を防止
環境変数 GIT_SSH_COMMAND を設定 カスタムSSHコマンドを使用;ssh-agentは引き続き動作
git config core.sshCommand を設定 上記と同様
direnvでSSH関連の環境変数を設定 共存可能;ssh-agentは独立して動作

推奨: SSH configでは常に IdentitiesOnly yes を設定してください。これにより、SSHが複数の鍵を試行することを防ぎます。

なぜ IdentitiesOnly yes

この設定がない場合、SSHは以下の順序で鍵を試行する可能性があります:

  1. ssh-agentに読み込まれた鍵(Git ID Switcherが管理)
  2. ~/.ssh/config で指定された鍵
  3. デフォルトの鍵(~/.ssh/id_rsa, ~/.ssh/id_ed25519 など)

これにより、認証失敗や意図しない鍵の使用が発生する可能性があります。

IdentitiesOnly yes を設定すると、SSHは指定された鍵のみを使用します。これにより、Git ID Switcherで設定した鍵が確実に使用されます。

# 推奨される設定
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes  # ← この行が重要

この設定により、github-work ホストへの接続時には ~/.ssh/id_ed25519_work のみが使用され、他の鍵は試行されません。


上級者向け: サブモジュールサポート

Gitサブモジュールを使用する複雑なリポジトリでは、プロフィール管理がしばしば厄介です。サブモジュール内でコミットすると、Gitはそのサブモジュールのローカル設定を使用しますが、明示的に設定されていない場合はグローバル設定(間違ったメールアドレス!)がデフォルトになる可能性があります。

Git ID Switcherは自動的にサブモジュールを検出し、選択したプロフィールを適用します。

{
  "gitIdSwitcher.applyToSubmodules": true,
  "gitIdSwitcher.submoduleDepth": 1
}
  • applyToSubmodules: この機能の有効/無効を切り替え
  • submoduleDepth: どの深さまで適用するか?
    • 1: 直接のサブモジュールのみ(最も一般的)
    • 2+: ネストされたサブモジュール(サブモジュール内のサブモジュール)

これにより、メインリポジトリでコミットしても、ベンダーライブラリでコミットしても、プロフィールは常に正しく設定されます。


トラブルシューティング

SSH鍵が切り替わらない?

  1. ssh-agentが実行されていることを確認:

    eval "$(ssh-agent -s)"
  2. 鍵のパスが正しいか確認:

    ls -la ~/.ssh/id_ed25519_*
  3. macOSでは、一度Keychainに追加:

    ssh-add --apple-use-keychain ~/.ssh/id_ed25519_work

プッシュ時に間違ったプロフィール?

新規クローン時:

仕事用リポジトリをクローンする際は、SSH configで設定したホストエイリアスを使用します:

# 仕事用(github-workエイリアスを使用)
git clone git@github-work:company/repo.git

# 個人用(デフォルトのgithub.comを使用)
git clone git@github.com:yourname/repo.git

既存リポジトリの場合:

  1. リモートURLが正しいホストエイリアスを使用しているか確認:

    git remote -v
    # 仕事用リポジトリなら git@github-work:... となっているべき
  2. 必要に応じて更新:

    git remote set-url origin git@github-work:company/repo.git

GPG署名が動作しない?

  1. GPG鍵IDを確認:

    gpg --list-secret-keys --keyid-format SHORT
  2. 署名をテスト:

    echo "test" | gpg --clearsign
  3. プロフィールのメールアドレスがGPG鍵のメールアドレスと一致していることを確認

プロフィールが検出されない?

  • Gitリポジトリ内にいることを確認
  • settings.jsonに構文エラーがないか確認
  • VS Codeウィンドウをリロード(Cmd+Shift+P → 「ウィンドウの再読み込み」)

name フィールドでエラーが発生する?

name フィールドに以下の文字が含まれているとエラーになります:

` $ ( ) { } | & < >

サービス名を含めたい場合は service フィールドを使用してください。

// NG
"name": "高橋カオル (個人)"

// OK
"name": "高橋カオル",
"service": "GitHub"

新しい設定項目が表示されない?

拡張機能を更新しても、新しい設定項目が設定画面に表示されない場合があります。

解決策: マシン全体を再起動してください。

VS Codeなどのエディタは設定スキーマをメモリにキャッシュしており、「ウィンドウの再読み込み」や拡張機能の再インストールだけでは更新されないことがあります。

デフォルト値(identities等)が空っぽ?

新規インストールでもサンプル設定が表示されない場合、Settings Syncが原因の可能性があります。

過去に空の設定を保存していた場合、その設定がクラウドに同期され、新規インストール時にデフォルト値を上書きしてしまいます。

解決策:

  1. 設定画面で該当の設定項目を見つける
  2. 歯車アイコン → 「設定をリセット」を選択
  3. Settings Syncで同期(古い設定がクラウドから削除される)

設計哲学

「私は誰」を切り替える — この拡張機能が答える唯一の問い

枯山水アーキテクチャで設計しています。コアは100行で書ける単純さ。 だからこそ、残りを品質(テスト90%、ログ、タイムアウト)と 意図的な制約(GitHub API連携なし、トークン管理なし)に費やせます。

Karesansui Architecture

設計哲学の全文を読む


貢献

貢献を歓迎します!CONTRIBUTING.mdをご覧ください。

ライセンス

MITライセンス - LICENSEをご覧ください。

クレジット

Null;Variant によって作成