|
|
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.
|
Es gibt viele Tools zum Wechseln von Git-Profilen, aber Git ID Switcher löst komplexe Probleme, die andere oft übersehen:
- Das Submodul-Problem: Bei der Arbeit mit Repositories mit Submodulen (z. B. Hugo-Themes, Vendor-Bibliotheken) müssen Sie normalerweise
git config user.namefür jedes Submodul manuell setzen. Diese Erweiterung löst das elegant, indem sie Ihr Profil rekursiv auf alle aktiven Submodule anwendet. - 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.
- 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
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.
Ein typisches Setup für die Verwendung von persönlichem Konto und Firmenkonto (Enterprise Managed User).
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_workRegistrieren 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.
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 yesDirekt nach der Installation stehen Beispielprofile bereit. Folgen Sie der Anleitung unten, um diese für Ihren Gebrauch zu bearbeiten.
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
gpgKeyIdim 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".
Ein vollständiges Beispiel, das alles kombiniert:
# 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{
"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.
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.
Sie können ein Profil auch über die Befehlspalette mit Git ID Switcher: Delete Identity löschen.
| Befehl | Beschreibung |
|---|---|
Git ID Switcher: Select Identity |
Profilauswahl öffnen |
Git ID Switcher: Delete Identity |
Profil löschen |
Git ID Switcher: Show Current Identity |
Aktuelles Profil anzeigen |
Git ID Switcher: Show Documentation |
Dokumentation anzeigen |
| Eigenschaft | Erforderlich | Beschreibung |
|---|---|---|
id |
✅ | Eindeutige Kennung (z. B. "personal", "work") |
name |
✅ | Git user.name — wird in Commits angezeigt |
email |
✅ | Git user.email — wird in Commits angezeigt |
icon |
Emoji in der Statusleiste (z. B. "🏠"). Nur einzelnes Emoji |
|
service |
Dienstname (z. B. "GitHub", "GitLab"). Für UI-Anzeige |
|
description |
Kurze Beschreibung in Auswahl und Tooltip | |
sshKeyPath |
Pfad zum privaten SSH-Schlüssel (z. B. "~/.ssh/id_ed25519_work") |
|
sshHost |
SSH-Config-Host-Alias (z. B. "github-work") |
|
gpgKeyId |
GPG-Schlüssel-ID für Commit-Signierung |
- 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
| Einstellung | Standard | Beschreibung |
|---|---|---|
gitIdSwitcher.identities |
Siehe Beispiel | Liste der Profilkonfigurationen |
gitIdSwitcher.defaultIdentity |
Siehe Beispiel | ID des zu verwendenden Standardprofils |
gitIdSwitcher.autoSwitchSshKey |
true |
SSH-Schlüssel beim Profilwechsel automatisch wechseln |
gitIdSwitcher.showNotifications |
true |
Benachrichtigung beim Profilwechsel anzeigen |
gitIdSwitcher.applyToSubmodules |
true |
Profil auf Git-Submodule übertragen |
gitIdSwitcher.submoduleDepth |
1 |
Maximale Tiefe für verschachtelte Submodul-Konfiguration (1-5) |
gitIdSwitcher.includeIconInGitConfig |
false |
Icon-Emoji in Git config user.name einschließen |
gitIdSwitcher.syncCheck.enabled |
true |
Prüfen, ob das ausgewählte Profil mit der tatsächlichen Git-Konfiguration übereinstimmt |
gitIdSwitcher.syncCheck.onFocusReturn |
true |
Sync Check ausführen, wenn das Editor-Fenster den Fokus wiedererlangt |
gitIdSwitcher.logging.fileEnabled |
false |
Audit-Protokoll in Datei speichern (Profilwechsel, SSH-Schlüsseloperationen usw.) |
gitIdSwitcher.logging.filePath |
"" |
Protokolldateipfad (z. B. ~/.git-id-switcher/security.log). Leer = Standardort |
gitIdSwitcher.logging.maxFileSize |
10485760 |
Maximale Dateigröße vor Rotation (Bytes, 1 MB–100 MB) |
gitIdSwitcher.logging.maxFiles |
5 |
Maximale Anzahl rotierter Protokolldateien (1-20) |
gitIdSwitcher.logging.redactAllSensitive |
false |
Wenn 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} |
Steuert das Verhalten, wenn das icon-Feld gesetzt ist:
| Wert | Verhalten |
|---|---|
false (Standard) |
icon wird nur in der Editor-UI angezeigt. Nur name wird in Git config geschrieben |
true |
icon + name wird in Git config geschrieben. Emoji erscheint im Commit-Verlauf |
Beispiel: icon: "👤", name: "Alex Müller"
| includeIconInGitConfig | Git config user.name |
Commit-Signatur |
|---|---|---|
false |
Alex Müller |
Alex Müller <email> |
true |
👤 Alex Müller |
👤 Alex Müller <email> |
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/configjedes Repositories gespeichert - Verschiedene Profile können pro Repository beibehalten werden
- Globale Einstellungen (
~/.gitconfig) werden nicht verändert
Beim Wechsel des Profils führt die Erweiterung folgendes aus (in dieser Reihenfolge):
- Git Config (immer): Setzt
git config --local user.nameunduser.email - SSH-Schlüssel (wenn
sshKeyPathgesetzt): Entfernt andere Schlüssel aus ssh-agent und fügt den ausgewählten hinzu - GPG-Schlüssel (wenn
gpgKeyIdgesetzt): Setztgit config --local user.signingkeyund aktiviert Signierung - Submodule (wenn aktiviert): Überträgt Konfiguration auf alle Submodule (Standard: Tiefe 1)
- Sync Check: Überprüft, ob das angewendete Profil mit der tatsächlichen Git-Konfiguration übereinstimmt
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.
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).
Git ID Switcher verwaltet SSH-Schlüssel über ssh-agent:
| Operation | Befehl |
|---|---|
| Schlüssel hinzufügen | ssh-add <keyPath> |
| Schlüssel entfernen | ssh-add -d <keyPath> |
| Schlüssel auflisten | ssh-add -l |
Wichtig: Diese Erweiterung ändert ~/.ssh/config nicht. Die SSH-Config-Einrichtung muss manuell erfolgen (siehe Schritt 2 unter „Schnellstart").
Wenn Sie bereits eine SSH-Konfiguration haben, arbeitet Git ID Switcher damit zusammen:
| Ihre Konfiguration | Verhalten von Git ID Switcher |
|---|---|
~/.ssh/config mit IdentityFile |
Beide nutzbar; IdentitiesOnly yes verhindert Konflikte |
Umgebungsvariable GIT_SSH_COMMAND |
Ihr SSH-Befehl wird verwendet; ssh-agent arbeitet weiter |
git config core.sshCommand |
Wie oben |
| direnv mit SSH-bezogenen Umgebungsvariablen | Koexistenz 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.
Ohne diese Einstellung versucht SSH möglicherweise Schlüssel in dieser Reihenfolge:
- Im ssh-agent geladene Schlüssel (von Git ID Switcher verwaltet)
- In
~/.ssh/configangegebene Schlüssel - Standardschlüssel (
~/.ssh/id_rsa,~/.ssh/id_ed25519usw.)
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 wichtigMit dieser Konfiguration wird bei Verbindungen zum github-work-Host nur ~/.ssh/id_ed25519_work verwendet, und es werden keine anderen Schlüssel ausprobiert.
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 FunktionsubmoduleDepth: 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.
-
Stellen Sie sicher, dass
ssh-agentläuft:eval "$(ssh-agent -s)"
-
Überprüfen Sie, ob der Schlüsselpfad korrekt ist:
ls -la ~/.ssh/id_ed25519_*
-
Auf macOS einmalig zum Schlüsselbund hinzufügen:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_work
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.gitBei bestehenden Repositories:
-
Prüfen Sie, ob die Remote-URL den richtigen Host-Alias verwendet:
git remote -v # Sollte für Arbeits-Repos git@github-work:... anzeigen -
Bei Bedarf aktualisieren:
git remote set-url origin git@github-work:company/repo.git
-
GPG-Schlüssel-ID ermitteln:
gpg --list-secret-keys --keyid-format SHORT
-
Signierung testen:
echo "test" | gpg --clearsign
-
Stellen Sie sicher, dass die E-Mail-Adresse in Ihrem Profil mit der E-Mail des GPG-Schlüssels übereinstimmt
- Stellen Sie sicher, dass Sie sich in einem Git-Repository befinden
- Prüfen Sie
settings.jsonauf Syntaxfehler - Laden Sie das VS Code-Fenster neu (
Cmd+Shift+P→ „Fenster neu laden")
Folgende Zeichen im name-Feld verursachen einen Fehler:
` $ ( ) { } | & < >
Verwenden Sie das service-Feld, wenn Sie Dienstinformationen einschließen möchten.
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.
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:
- Finden Sie die Einstellung in der Einstellungs-UI
- Klicken Sie auf das Zahnrad-Symbol → „Einstellung zurücksetzen"
- Mit Settings Sync synchronisieren (dies entfernt die alten Einstellungen aus der Cloud)
„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.
Die vollständige Philosophie lesen
Beiträge willkommen! Siehe CONTRIBUTING.md.
MIT-Lizenz — siehe LICENSE.
Erstellt von Null;Variant


