|
|
ワンクリックで複数のGitプロフィールを切り替え。複数のGitHubアカウント、SSH鍵、GPG署名を管理し、Gitサブモジュールにも自動的にプロフィールを適用します。
|
Gitプロフィール切り替えツールは数多く存在しますが、Git ID Switcherは他のツールが見落としがちな複雑な問題を解決します:
- サブモジュールの悩み: サブモジュールを持つリポジトリ(例:Hugoテーマ、ベンダーライブラリ)で作業する際、通常は各サブモジュールに対して
git config user.nameを手動で設定する必要があります。この拡張機能は、すべてのアクティブなサブモジュールに再帰的にプロフィールを適用することで、これをエレガントに解決します。 - 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)を使い分ける典型的なセットアップです。
まず、アカウントごとに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(拡張子なし)は秘密鍵なので、絶対に他人と共有したりアップロードしないでください。
~/.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インストール直後はサンプルプロフィールが用意されています。 以下のガイドに沿って、これを自分用に編集しましょう。
鍵ファイルは送信されません: SSH鍵パスの設定で記録されるのは鍵ファイルのパス(場所)だけです。鍵ファイルの中身がアップロードされたり外部に送信されることはありません。
GPG署名を使う場合: プロフィール編集画面で
gpgKeyIdも設定できます。 GPG鍵IDの確認方法は「トラブルシューティング」を参照してください。
ヒント: settings.jsonから直接設定することもできます。 拡張機能の設定を開き(
Cmd+,/Ctrl+,)→「Git ID Switcher」を検索 →「settings.jsonで編集」をクリック。 JSON形式での設定例は「フル設定例」を参照してください。
すべてを組み合わせた完全な例:
# 個人用アカウント(デフォルト)
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} |
icon フィールドを設定した場合の動作を制御します:
| 値 | 動作 |
|---|---|
false(デフォルト) |
iconはエディタUIのみに表示。Git configにはnameのみ書き込み |
true |
Git configにicon + nameを書き込み。コミット履歴にも絵文字が残る |
例:icon: "👤", name: "高橋カオル" の場合
| includeIconInGitConfig | Git config user.name |
コミット署名 |
|---|---|---|
false |
高橋カオル |
高橋カオル <email> |
true |
👤 高橋カオル |
👤 高橋カオル <email> |
Gitの設定には3つのレイヤーがあり、下位の設定を上位が上書きします:
システム (/etc/gitconfig)
↓ 上書き
グローバル (~/.gitconfig)
↓ 上書き
ローカル (.git/config) ← 最優先
Git ID Switcherは --local(リポジトリローカル)に書き込みます。
つまり:
- 各リポジトリの
.git/configにプロフィールを保存します - リポジトリごとに異なるプロフィールを維持できます
- グローバル設定(
~/.gitconfig)は変更しません
プロフィールを切り替えると、拡張機能は以下を(順番に)実行します:
- Git Config(常時):
git config --local user.nameとuser.emailを設定 - SSH鍵(
sshKeyPath設定時): 他の鍵をssh-agentから削除し、選択した鍵を追加 - GPG鍵(
gpgKeyId設定時):git config --local user.signingkeyを設定し、署名を有効化 - サブモジュール(有効時): すべてのサブモジュールに設定を伝播(デフォルト:深度1)
- 同期チェック: 適用したプロフィールとgit configが一致しているか自動検証
選択中のプロフィールと実際の git config --local の値(user.name, user.email, user.signingkey)を比較し、不一致があればステータスバーに警告を表示します。
チェックのタイミング:
- プロフィール適用直後
- ワークスペースフォルダ変更時
- 設定変更時
- エディタウィンドウへのフォーカス復帰時(デバウンス500ms)
不一致が検出された場合:
- ステータスバーに
⚠️ が表示され、背景が警告色に変わります - ツールチップに不一致の詳細(項目・期待値・実際の値)がテーブル形式で表示されます
- クリックすると解決方法の選択肢が表示されます:
- プロフィールを再適用 — 現在のプロフィールをgit configに再適用
- 別のプロフィールを選択 — プロフィールピッカーを開く
- 無視 — 次回のチェックまで警告を抑制
無効化するには:
gitIdSwitcher.syncCheck.enabled を false に設定すると、すべての同期チェックが無効になります。
フォーカス復帰時のチェックのみ無効にしたい場合は、gitIdSwitcher.syncCheck.onFocusReturn を false に設定してください。
ローカル設定はリポジトリ単位のため、サブモジュールには自動的に適用されません。 そのため、本拡張機能はサブモジュールへの伝播機能を提供しています(詳細は「上級者向け: サブモジュールサポート」を参照)。
Git ID Switcherはssh-agentを通じてSSH鍵を管理します:
| 操作 | 実行コマンド |
|---|---|
| 鍵を追加 | ssh-add <keyPath> |
| 鍵を削除 | ssh-add -d <keyPath> |
| 鍵の一覧 | ssh-add -l |
重要: この拡張機能は ~/.ssh/config を変更しません。SSH configの設定は手動で行う必要があります(「クイックスタート」のステップ2を参照)。
すでにSSH設定がある場合、Git ID Switcherは以下のように動作します:
| あなたの設定 | Git ID Switcherの動作 |
|---|---|
~/.ssh/config で IdentityFile を指定 |
両方が使用可能;IdentitiesOnly yes で競合を防止 |
環境変数 GIT_SSH_COMMAND を設定 |
カスタムSSHコマンドを使用;ssh-agentは引き続き動作 |
git config core.sshCommand を設定 |
上記と同様 |
| direnvでSSH関連の環境変数を設定 | 共存可能;ssh-agentは独立して動作 |
推奨: SSH configでは常に IdentitiesOnly yes を設定してください。これにより、SSHが複数の鍵を試行することを防ぎます。
この設定がない場合、SSHは以下の順序で鍵を試行する可能性があります:
- ssh-agentに読み込まれた鍵(Git ID Switcherが管理)
~/.ssh/configで指定された鍵- デフォルトの鍵(
~/.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-agentが実行されていることを確認:eval "$(ssh-agent -s)"
-
鍵のパスが正しいか確認:
ls -la ~/.ssh/id_ed25519_*
-
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既存リポジトリの場合:
-
リモートURLが正しいホストエイリアスを使用しているか確認:
git remote -v # 仕事用リポジトリなら git@github-work:... となっているべき -
必要に応じて更新:
git remote set-url origin git@github-work:company/repo.git
-
GPG鍵IDを確認:
gpg --list-secret-keys --keyid-format SHORT
-
署名をテスト:
echo "test" | gpg --clearsign
-
プロフィールのメールアドレスがGPG鍵のメールアドレスと一致していることを確認
- Gitリポジトリ内にいることを確認
settings.jsonに構文エラーがないか確認- VS Codeウィンドウをリロード(
Cmd+Shift+P→ 「ウィンドウの再読み込み」)
name フィールドに以下の文字が含まれているとエラーになります:
` $ ( ) { } | & < >
サービス名を含めたい場合は service フィールドを使用してください。
拡張機能を更新しても、新しい設定項目が設定画面に表示されない場合があります。
解決策: マシン全体を再起動してください。
VS Codeなどのエディタは設定スキーマをメモリにキャッシュしており、「ウィンドウの再読み込み」や拡張機能の再インストールだけでは更新されないことがあります。
新規インストールでもサンプル設定が表示されない場合、Settings Syncが原因の可能性があります。
過去に空の設定を保存していた場合、その設定がクラウドに同期され、新規インストール時にデフォルト値を上書きしてしまいます。
解決策:
- 設定画面で該当の設定項目を見つける
- 歯車アイコン → 「設定をリセット」を選択
- Settings Syncで同期(古い設定がクラウドから削除される)
「私は誰」を切り替える — この拡張機能が答える唯一の問い
枯山水アーキテクチャで設計しています。コアは100行で書ける単純さ。 だからこそ、残りを品質(テスト90%、ログ、タイムアウト)と 意図的な制約(GitHub API連携なし、トークン管理なし)に費やせます。
貢献を歓迎します!CONTRIBUTING.mdをご覧ください。
MITライセンス - LICENSEをご覧ください。
Null;Variant によって作成


