Git ID Switcher

May 8, 2026 · View on GitHub

Git ID Switcher Wechseln Sie mit einem Klick zwischen mehreren Git-Profilen. Verwalten Sie mehrere GitHub-Konten, SSH-Schlüssel, GPG-Signierung und wenden Sie Profile automatisch auf Git-Submodule an.

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 🇺🇸 🇯🇵 🇨🇳 🇹🇼 🇰🇷 🇩🇪 🇫🇷 🇪🇸 🇧🇷 🇮🇹 🇷🇺 🇵🇱 🇹🇷 🇨🇿 🇭🇺 🇧🇬 🇺🇦 🌍 🌺 🐻 🐉 🖖 🐱 🏴‍☠️ 🎭

Demo

🎯 Warum Git ID Switcher?

Es gibt viele Tools zum Wechseln von Git-Profilen, aber Git ID Switcher löst komplexe Probleme, die andere oft übersehen:

  1. Das Submodul-Problem: Bei der Arbeit mit Repositories mit Submodulen (z. B. Hugo-Themes, Vendor-Bibliotheken) müssen Sie normalerweise git config user.name für jedes Submodul manuell setzen. Diese Erweiterung löst das elegant, indem sie Ihr Profil rekursiv auf alle aktiven Submodule anwendet.
  2. SSH- und GPG-Handling: Es ändert nicht nur Ihren Namen — es tauscht SSH-Schlüssel im ssh-agent aus und konfiguriert die GPG-Signierung, damit Sie nie mit der falschen Signatur committen.

Funktionen

  • Profilverwaltungs-UI: Profile hinzufügen, bearbeiten, löschen und umordnen — ohne settings.json zu bearbeiten
  • Ein-Klick-Profilwechsel: Git user.name und user.email sofort ändern
  • Statusleisten-Integration: Aktuelles Profil immer auf einen Blick sehen
  • Sync Check: Echtzeit-Erkennung von Abweichungen zwischen Profil und Git-Konfiguration mit Statusleisten-Warnung
  • Submodul-Unterstützung: Profil automatisch auf Git-Submodule übertragen
  • SSH-Schlüsselverwaltung: SSH-Schlüssel im ssh-agent automatisch wechseln
  • GPG-Signierungsunterstützung: GPG-Schlüssel für Commit-Signierung konfigurieren (optional)
  • Reichhaltige Tooltips: Detaillierte Profilinformationen mit Beschreibung und SSH-Host
  • Plattformübergreifend: Funktioniert auf macOS, Linux und Windows
  • Mehrsprachig: Unterstützt 17 Sprachen

🌏 Ein Wort zur Mehrsprachigkeit

Ich schätze die Existenz von Minderheiten. Ich möchte sie nicht verwerfen, nur weil sie zahlenmäßig klein sind. Auch wenn Übersetzungen nicht perfekt sein mögen, hoffe ich, dass Sie unsere Absicht spüren, Minderheitensprachen zu verstehen und zu respektieren.

Diese Erweiterung unterstützt alle 17 Sprachen, die VS Code unterstützt. Darüber hinaus versuchen wir bei der README-Dokumentation, auch in Minderheitensprachen und sogar Scherzsprachen zu übersetzen.

Das ist nicht nur „globale Unterstützung" — es ist „Respekt für sprachliche Vielfalt". Und ich würde mich freuen, wenn dies zur Infrastruktur wird, über die Entwickler auf der ganzen Welt, Sprachbarrieren überwindend, Commits senden, die die Welt verbessern.


Schnellstart

Ein typisches Setup für die Verwendung von persönlichem Konto und Firmenkonto (Enterprise Managed User).

Schritt 1: SSH-Schlüssel vorbereiten

Erstellen Sie zunächst SSH-Schlüssel für jedes Konto (überspringen Sie dies, wenn Sie bereits welche haben):

# Persönlich
ssh-keygen -t ed25519 -C "alex@personal.example.com" -f ~/.ssh/id_ed25519_personal

# Arbeit
ssh-keygen -t ed25519 -C "alex.mueller@techcorp.example.com" -f ~/.ssh/id_ed25519_work

Registrieren Sie den öffentlichen Schlüssel (.pub-Datei) jedes SSH-Schlüssels beim entsprechenden GitHub-Konto.

Hinweis: Bei GitHub registrieren Sie id_ed25519_personal.pub (öffentlicher Schlüssel). id_ed25519_personal (ohne Erweiterung) ist der private Schlüssel — teilen Sie ihn niemals mit anderen und laden Sie ihn nirgendwo hoch.

Schritt 2: SSH konfigurieren

Bearbeiten Sie ~/.ssh/config:

# Persönliches GitHub-Konto (Standard)
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_personal
    IdentitiesOnly yes

# Arbeits-GitHub-Konto
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes

Schritt 3: Erweiterung konfigurieren

Direkt nach der Installation stehen Beispielprofile bereit. Folgen Sie der Anleitung unten, um diese für Ihren Gebrauch zu bearbeiten.

Ersteinrichtung: Profilverwaltung über die Statusleiste öffnen, dann bearbeiten und neue Profile erstellen

Schlüsseldateien werden nicht gesendet: Beim Festlegen von SSH-Schlüsselpfaden wird nur der Dateipfad (Speicherort) gespeichert. Der Inhalt der Schlüsseldatei wird niemals hochgeladen oder extern übertragen.

Bei Verwendung von GPG-Signierung: Sie können auch gpgKeyId im Profilbearbeitungsbildschirm festlegen. Wie Sie Ihre GPG-Schlüssel-ID finden, erfahren Sie unter „Fehlerbehebung".

Hinweis: Sie können auch direkt über settings.json konfigurieren. Öffnen Sie die Erweiterungseinstellungen (Cmd+, / Strg+,) → suchen Sie „Git ID Switcher" → klicken Sie auf „In settings.json bearbeiten". JSON-Konfigurationsbeispiele finden Sie unter „Vollständiges Beispiel".


Vollständiges Beispiel: 5 Konten mit SSH + GPG

Ein vollständiges Beispiel, das alles kombiniert:

SSH-Konfiguration (~/.ssh/config)

# Persönliches Konto (Standard)
Host github-personal
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_personal
    IdentitiesOnly yes

# Arbeitskonto (vom Unternehmen ausgestellter Enterprise Managed User)
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes

# Kunde A – Auftragsprojekt (Bitbucket)
Host bitbucket-clienta
    HostName bitbucket.org
    User git
    IdentityFile ~/.ssh/id_ed25519_clienta
    IdentitiesOnly yes

# Kunde B – Vor-Ort-Projekt (Bitbucket)
Host bitbucket-clientb
    HostName bitbucket.org
    User git
    IdentityFile ~/.ssh/id_ed25519_clientb
    IdentitiesOnly yes

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

Erweiterungseinstellungen

{
  "gitIdSwitcher.identities": [
    {
      "id": "personal",
      "name": "Alex Müller",
      "email": "alex@personal.example.com",
      "service": "GitHub",
      "icon": "🏠",
      "description": "Persönliche Projekte",
      "sshKeyPath": "~/.ssh/id_ed25519_personal",
      "sshHost": "github-personal",
      "gpgKeyId": "ABCD1234EF567890"
    },
    {
      "id": "work-main",
      "name": "Alex Müller",
      "email": "alex.mueller@techcorp.example.com",
      "service": "GitHub Arbeit",
      "icon": "💼",
      "description": "TechCorp Hauptjob",
      "sshKeyPath": "~/.ssh/id_ed25519_work",
      "sshHost": "github-work",
      "gpgKeyId": "9876543210FEDCBA"
    },
    {
      "id": "client-a",
      "name": "Alex Müller",
      "email": "alex@clienta.example.com",
      "service": "Bitbucket",
      "icon": "🏢",
      "description": "ClientA Auftrag",
      "sshKeyPath": "~/.ssh/id_ed25519_clienta",
      "sshHost": "bitbucket-clienta"
    },
    {
      "id": "client-b",
      "name": "A.Müller",
      "email": "a.mueller@clientb.example.com",
      "service": "Bitbucket",
      "icon": "🏭",
      "description": "ClientB Vor-Ort",
      "sshKeyPath": "~/.ssh/id_ed25519_clientb",
      "sshHost": "bitbucket-clientb"
    },
    {
      "id": "oss",
      "name": "alex-dev",
      "email": "alex.dev@example.com",
      "service": "GitLab",
      "icon": "🌟",
      "description": "OSS-Beiträge",
      "sshKeyPath": "~/.ssh/id_ed25519_oss",
      "sshHost": "gitlab-oss"
    }
  ],
  "gitIdSwitcher.defaultIdentity": "personal",
  "gitIdSwitcher.autoSwitchSshKey": true,
  "gitIdSwitcher.applyToSubmodules": true
}

Hinweis: Das 4. Profil (client-b) verwendet einen Kurznamen und das 5. (oss) ein Entwickler-Handle. Sie können für jedes Profil einen anderen Anzeigenamen festlegen, auch für dieselbe Person.


Profilverwaltung

Klicken Sie auf die Statusleiste → wählen Sie „Profilverwaltung" am Ende der Liste, um die Verwaltungsoberfläche zu öffnen. Profile hinzufügen, bearbeiten, löschen und umordnen — alles direkt über die Benutzeroberfläche.

Profilverwaltung: Anleitung zum Löschen und Umordnen

Sie können ein Profil auch über die Befehlspalette mit Git ID Switcher: Delete Identity löschen.


Befehle

BefehlBeschreibung
Git ID Switcher: Select IdentityProfilauswahl öffnen
Git ID Switcher: Delete IdentityProfil löschen
Git ID Switcher: Show Current IdentityAktuelles Profil anzeigen
Git ID Switcher: Show DocumentationDokumentation anzeigen

Konfigurationsreferenz

Profileigenschaften

EigenschaftErforderlichBeschreibung
idEindeutige Kennung (z. B. "personal", "work")
nameGit user.name — wird in Commits angezeigt
emailGit user.email — wird in Commits angezeigt
iconEmoji in der Statusleiste (z. B. "🏠"). Nur einzelnes Emoji
serviceDienstname (z. B. "GitHub", "GitLab"). Für UI-Anzeige
descriptionKurze Beschreibung in Auswahl und Tooltip
sshKeyPathPfad zum privaten SSH-Schlüssel (z. B. "~/.ssh/id_ed25519_work")
sshHostSSH-Config-Host-Alias (z. B. "github-work")
gpgKeyIdGPG-Schlüssel-ID für Commit-Signierung

Anzeigenbeschränkungen

  • Statusleiste: Text über ca. 25 Zeichen wird mit ... abgeschnitten
  • icon: Nur ein einzelnes Emoji (Graphem-Cluster) erlaubt. Mehrere Emojis oder lange Zeichenketten werden nicht unterstützt

Globale Einstellungen

EinstellungStandardBeschreibung
gitIdSwitcher.identitiesSiehe BeispielListe der Profilkonfigurationen
gitIdSwitcher.defaultIdentitySiehe BeispielID des zu verwendenden Standardprofils
gitIdSwitcher.autoSwitchSshKeytrueSSH-Schlüssel beim Profilwechsel automatisch wechseln
gitIdSwitcher.showNotificationstrueBenachrichtigung beim Profilwechsel anzeigen
gitIdSwitcher.applyToSubmodulestrueProfil auf Git-Submodule übertragen
gitIdSwitcher.submoduleDepth1Maximale Tiefe für verschachtelte Submodul-Konfiguration (1-5)
gitIdSwitcher.includeIconInGitConfigfalseIcon-Emoji in Git config user.name einschließen
gitIdSwitcher.syncCheck.enabledtruePrüfen, ob das ausgewählte Profil mit der tatsächlichen Git-Konfiguration übereinstimmt
gitIdSwitcher.syncCheck.onFocusReturntrueSync Check ausführen, wenn das Editor-Fenster den Fokus wiedererlangt
gitIdSwitcher.logging.fileEnabledfalseAudit-Protokoll in Datei speichern (Profilwechsel, SSH-Schlüsseloperationen usw.)
gitIdSwitcher.logging.filePath""Protokolldateipfad (z. B. ~/.git-id-switcher/security.log). Leer = Standardort
gitIdSwitcher.logging.maxFileSize10485760Maximale Dateigröße vor Rotation (Bytes, 1 MB–100 MB)
gitIdSwitcher.logging.maxFiles5Maximale Anzahl rotierter Protokolldateien (1-20)
gitIdSwitcher.logging.redactAllSensitivefalseWenn aktiviert, werden alle Werte in Protokollen maskiert (maximaler Datenschutz)
gitIdSwitcher.logging.level"INFO"Protokollebene (DEBUG, INFO, WARN, ERROR, SECURITY). Zeichnet ausgewählte Ebene und höher auf
gitIdSwitcher.commandTimeouts{}Benutzerdefiniertes Timeout pro Befehl (ms, 1 Sek.–5 Min.). Z. B. {"git": 15000, "ssh-add": 10000}

Über includeIconInGitConfig

Steuert das Verhalten, wenn das icon-Feld gesetzt ist:

WertVerhalten
false (Standard)icon wird nur in der Editor-UI angezeigt. Nur name wird in Git config geschrieben
trueicon + name wird in Git config geschrieben. Emoji erscheint im Commit-Verlauf

Beispiel: icon: "👤", name: "Alex Müller"

includeIconInGitConfigGit config user.nameCommit-Signatur
falseAlex MüllerAlex Müller <email>
true👤 Alex Müller👤 Alex Müller <email>

Funktionsweise

Git-Config-Schichtstruktur

Git-Konfiguration hat drei Schichten, wobei höhere Schichten die niedrigeren überschreiben:

System (/etc/gitconfig)
    ↓ überschrieben durch
Global (~/.gitconfig)
    ↓ überschrieben durch
Lokal (.git/config)  ← höchste Priorität

Git ID Switcher schreibt in --local (Repository-lokal).

Das bedeutet:

  • Profile werden in .git/config jedes Repositories gespeichert
  • Verschiedene Profile können pro Repository beibehalten werden
  • Globale Einstellungen (~/.gitconfig) werden nicht verändert

Verhalten beim Profilwechsel

Beim Wechsel des Profils führt die Erweiterung folgendes aus (in dieser Reihenfolge):

  1. Git Config (immer): Setzt git config --local user.name und user.email
  2. SSH-Schlüssel (wenn sshKeyPath gesetzt): Entfernt andere Schlüssel aus ssh-agent und fügt den ausgewählten hinzu
  3. GPG-Schlüssel (wenn gpgKeyId gesetzt): Setzt git config --local user.signingkey und aktiviert Signierung
  4. Submodule (wenn aktiviert): Überträgt Konfiguration auf alle Submodule (Standard: Tiefe 1)
  5. Sync Check: Überprüft, ob das angewendete Profil mit der tatsächlichen Git-Konfiguration übereinstimmt

Sync Check

Vergleicht das ausgewählte Profil mit den tatsächlichen git config --local-Werten (user.name, user.email, user.signingkey) und zeigt eine Statusleisten-Warnung an, wenn eine Abweichung erkannt wird.

Wann Prüfungen ausgeführt werden:

  • Unmittelbar nach dem Anwenden des Profils
  • Bei Wechsel des Arbeitsbereichsordners
  • Bei Konfigurationsänderung
  • Wenn das Editor-Fenster den Fokus wiedererlangt (entprellt 500 ms)

Wenn eine Abweichung erkannt wird:

  • Die Statusleiste zeigt ein ⚠️-Symbol mit einer Warnhintergrundfarbe
  • Der Tooltip zeigt eine Tabelle mit den abweichenden Feldern (Feld, erwarteter Wert, tatsächlicher Wert)
  • Ein Klick auf die Statusleiste bietet Lösungsoptionen:
    • Profil erneut anwenden — Das aktuelle Profil erneut auf die Git-Konfiguration anwenden
    • Anderes Profil auswählen — Die Profilauswahl öffnen
    • Verwerfen — Die Warnung bis zur nächsten Prüfung unterdrücken

Zum Deaktivieren:

Setzen Sie gitIdSwitcher.syncCheck.enabled auf false, um alle Sync Checks zu deaktivieren. Um nur die Fokus-Rückkehr-Prüfung zu deaktivieren, setzen Sie gitIdSwitcher.syncCheck.onFocusReturn auf false.

Wie die Submodul-Übertragung funktioniert

Lokale Einstellungen sind pro Repository, daher werden sie nicht automatisch auf Submodule angewendet. Deshalb bietet diese Erweiterung eine Submodul-Übertragungsfunktion (siehe „Fortgeschritten: Submodul-Unterstützung" für Details).

SSH-Schlüsselverwaltung im Detail

Git ID Switcher verwaltet SSH-Schlüssel über ssh-agent:

OperationBefehl
Schlüssel hinzufügenssh-add <keyPath>
Schlüssel entfernenssh-add -d <keyPath>
Schlüssel auflistenssh-add -l

Wichtig: Diese Erweiterung ändert ~/.ssh/config nicht. Die SSH-Config-Einrichtung muss manuell erfolgen (siehe Schritt 2 unter „Schnellstart").

Zusammenspiel mit bestehender SSH-Konfiguration

Wenn Sie bereits eine SSH-Konfiguration haben, arbeitet Git ID Switcher damit zusammen:

Ihre KonfigurationVerhalten von Git ID Switcher
~/.ssh/config mit IdentityFileBeide nutzbar; IdentitiesOnly yes verhindert Konflikte
Umgebungsvariable GIT_SSH_COMMANDIhr SSH-Befehl wird verwendet; ssh-agent arbeitet weiter
git config core.sshCommandWie oben
direnv mit SSH-bezogenen UmgebungsvariablenKoexistenz möglich; ssh-agent arbeitet unabhängig

Empfohlen: Setzen Sie in Ihrer SSH-Config immer IdentitiesOnly yes. Dies verhindert, dass SSH mehrere Schlüssel ausprobiert.

Warum IdentitiesOnly yes?

Ohne diese Einstellung versucht SSH möglicherweise Schlüssel in dieser Reihenfolge:

  1. Im ssh-agent geladene Schlüssel (von Git ID Switcher verwaltet)
  2. In ~/.ssh/config angegebene Schlüssel
  3. Standardschlüssel (~/.ssh/id_rsa, ~/.ssh/id_ed25519 usw.)

Dies kann zu Authentifizierungsfehlern oder unbeabsichtigter Schlüsselverwendung führen.

Mit IdentitiesOnly yes verwendet SSH nur den angegebenen Schlüssel. Damit wird sichergestellt, dass der in Git ID Switcher konfigurierte Schlüssel zuverlässig verwendet wird.

# Empfohlene Konfiguration
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes  # ← Diese Zeile ist wichtig

Mit dieser Konfiguration wird bei Verbindungen zum github-work-Host nur ~/.ssh/id_ed25519_work verwendet, und es werden keine anderen Schlüssel ausprobiert.


Fortgeschritten: Submodul-Unterstützung

Bei komplexen Repositories mit Git-Submodulen ist die Profilverwaltung oft mühsam. Beim Committen in einem Submodul verwendet Git die lokale Konfiguration dieses Submoduls, die möglicherweise auf die globale Konfiguration zurückfällt (falsche E-Mail!), wenn sie nicht explizit gesetzt ist.

Git ID Switcher erkennt Submodule automatisch und wendet das ausgewählte Profil an.

{
  "gitIdSwitcher.applyToSubmodules": true,
  "gitIdSwitcher.submoduleDepth": 1
}
  • applyToSubmodules: Aktivieren/Deaktivieren dieser Funktion
  • submoduleDepth: Wie tief soll angewendet werden?
    • 1: Nur direkte Submodule (am häufigsten)
    • 2+: Verschachtelte Submodule (Submodule in Submodulen)

Damit ist Ihr Profil immer korrekt, egal ob Sie im Haupt-Repository oder in einer Vendor-Bibliothek committen.


Fehlerbehebung

SSH-Schlüssel wird nicht gewechselt?

  1. Stellen Sie sicher, dass ssh-agent läuft:

    eval "$(ssh-agent -s)"
    
  2. Überprüfen Sie, ob der Schlüsselpfad korrekt ist:

    ls -la ~/.ssh/id_ed25519_*
    
  3. Auf macOS einmalig zum Schlüsselbund hinzufügen:

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

Falsches Profil beim Pushen?

Beim neuen Klonen:

Verwenden Sie beim Klonen von Arbeits-Repositories den in der SSH-Config eingerichteten Host-Alias:

# Arbeit (github-work-Alias verwenden)
git clone git@github-work:company/repo.git

# Persönlich (Standard github.com verwenden)
git clone git@github.com:yourname/repo.git

Bei bestehenden Repositories:

  1. Prüfen Sie, ob die Remote-URL den richtigen Host-Alias verwendet:

    git remote -v
    # Sollte für Arbeits-Repos git@github-work:... anzeigen
    
  2. Bei Bedarf aktualisieren:

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

GPG-Signierung funktioniert nicht?

  1. GPG-Schlüssel-ID ermitteln:

    gpg --list-secret-keys --keyid-format SHORT
    
  2. Signierung testen:

    echo "test" | gpg --clearsign
    
  3. Stellen Sie sicher, dass die E-Mail-Adresse in Ihrem Profil mit der E-Mail des GPG-Schlüssels übereinstimmt

Profil wird nicht erkannt?

  • Stellen Sie sicher, dass Sie sich in einem Git-Repository befinden
  • Prüfen Sie settings.json auf Syntaxfehler
  • Laden Sie das VS Code-Fenster neu (Cmd+Shift+P → „Fenster neu laden")

Fehler im name-Feld?

Folgende Zeichen im name-Feld verursachen einen Fehler:

` $ ( ) { } | & < >

Verwenden Sie das service-Feld, wenn Sie Dienstinformationen einschließen möchten.

// NG
"name": "Alex Müller (Persönlich)"

// OK
"name": "Alex Müller",
"service": "GitHub"

Neue Einstellungen werden nicht angezeigt?

Nach dem Aktualisieren der Erweiterung werden neue Einstellungen möglicherweise nicht in der Einstellungs-UI angezeigt.

Lösung: Starten Sie Ihren Computer vollständig neu.

VS-Code-basierte Editoren cachen das Einstellungsschema im Speicher, und „Fenster neu laden" oder Neuinstallation der Erweiterung reicht möglicherweise nicht aus, um es zu aktualisieren.

Standardwerte (identities usw.) leer?

Wenn Beispieleinstellungen auch nach einer Neuinstallation nicht erscheinen, könnte Settings Sync die Ursache sein.

Wenn Sie zuvor leere Einstellungen gespeichert haben, wurden sie möglicherweise in die Cloud synchronisiert und überschreiben bei Neuinstallationen die Standardwerte.

Lösung:

  1. Finden Sie die Einstellung in der Einstellungs-UI
  2. Klicken Sie auf das Zahnrad-Symbol → „Einstellung zurücksetzen"
  3. Mit Settings Sync synchronisieren (dies entfernt die alten Einstellungen aus der Cloud)

Designphilosophie

„Wer bin ich?" wechseln — Die einzige Frage, die diese Erweiterung beantwortet

Entwickelt nach der Karesansui-Architektur: Ein einfacher Kern (100 Zeilen). Deshalb kann der Rest in Qualität (90 % Tests, Logging, Timeouts) und bewusste Einschränkungen (keine GitHub-API, keine Token-Verwaltung) investiert werden.

Karesansui Architecture

Die vollständige Philosophie lesen


Mitwirken

Beiträge willkommen! Siehe CONTRIBUTING.md.

Lizenz

MIT-Lizenz — siehe LICENSE.

Credits

Erstellt von Null;Variant