Git ID Switcher
May 8, 2026 · View on GitHub
|
|
Passa tra più profili Git con un clic. Gestisci più account GitHub, chiavi SSH, firma GPG e applica automaticamente il profilo ai sottomoduli Git.
|
🎯 Perché Git ID Switcher?
Esistono molti strumenti per cambiare profilo Git, ma Git ID Switcher risolve problemi complessi che altri spesso trascurano:
- L'incubo dei sottomoduli: Quando lavori con repository che hanno sottomoduli (temi Hugo, librerie vendor, ecc.), di solito devi configurare
git config user.namemanualmente per ogni sottomodulo. Questa estensione lo gestisce elegantemente applicando ricorsivamente il profilo a tutti i sottomoduli attivi. - Gestione SSH e GPG: Non cambia solo il nome; scambia anche le chiavi SSH nell'ssh-agent e configura la firma GPG, così non farai mai commit con la firma sbagliata.
Funzionalità
- UI Gestione Profili: Aggiungi, modifica, elimina e riordina i profili senza modificare settings.json
- Cambio profilo con un clic: Modifica Git user.name e user.email istantaneamente
- Integrazione barra di stato: Visualizza sempre il profilo corrente a colpo d'occhio
- Sync Check: Rilevamento in tempo reale delle discrepanze tra profilo e configurazione git, con avviso nella barra di stato
- Supporto sottomoduli: Propaga automaticamente il profilo ai sottomoduli Git
- Gestione chiavi SSH: Cambia automaticamente le chiavi SSH in ssh-agent
- Supporto firma GPG: Configura la chiave GPG per firmare i commit (opzionale)
- Tooltip dettagliati: Informazioni complete sul profilo con descrizione e host SSH
- Multipiattaforma: Funziona su macOS, Linux e Windows
- Multilingue: Supporta 17 lingue
🌏 Una nota sul supporto multilingue
Valorizzo l'esistenza delle minoranze. Non voglio scartarle solo perché sono poche. Anche se le traduzioni non sono perfette, spero che possiate percepire la nostra intenzione di comprendere e mostrare rispetto per le lingue minoritarie.
Questa estensione supporta tutte le 17 lingue supportate da VS Code. Inoltre, per la documentazione README, ci stiamo sfidando a tradurre in lingue minoritarie e persino lingue umoristiche.
Questo non è solo "supporto globale" — è "rispetto per la diversità linguistica". E sarei felice se questo diventasse un'infrastruttura dove commit che migliorano il mondo provengono da sviluppatori ovunque, trascendendo le barriere linguistiche.
Avvio Rapido
Una configurazione tipica per gestire un account personale e un account aziendale (Enterprise Managed User).
Passo 1: Preparare le chiavi SSH
Prima, crea le chiavi SSH per ogni account (salta se le hai già):
# Personale
ssh-keygen -t ed25519 -C "andrea@personal.example.com" -f ~/.ssh/id_ed25519_personal
# Lavoro
ssh-keygen -t ed25519 -C "andrea.rossi@techcorp.example.com" -f ~/.ssh/id_ed25519_work
Registra la chiave pubblica (file .pub) di ogni chiave SSH sul rispettivo account GitHub.
Nota: Su GitHub registra
id_ed25519_personal.pub(chiave pubblica).id_ed25519_personal(senza estensione) è la chiave privata — non condividerla mai né caricarla da nessuna parte.
Passo 2: Configurare SSH
Modifica ~/.ssh/config:
# Account GitHub personale (predefinito)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
# Account GitHub aziendale
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
Passo 3: Configurare l'estensione
Dopo l'installazione, sono disponibili profili di esempio. Segui la guida qui sotto per modificarli secondo le tue esigenze.
I file delle chiavi non vengono inviati: Quando imposti il percorso della chiave SSH, viene registrato solo il percorso (posizione) del file della chiave. Il contenuto del file della chiave non viene mai caricato né inviato esternamente.
Se usi la firma GPG: Puoi anche impostare
gpgKeyIdnella schermata di modifica del profilo. Per sapere come trovare il tuo ID chiave GPG, consulta "Risoluzione Problemi".
Suggerimento: Puoi anche configurare direttamente da settings.json. Apri le impostazioni dell'estensione (
Cmd+,/Ctrl+,) → cerca "Git ID Switcher" → clicca "Modifica in settings.json". Per un esempio di configurazione JSON, consulta "Esempio Completo".
Esempio Completo: 5 Account con SSH + GPG
Un esempio completo che combina tutto:
Configurazione SSH (~/.ssh/config)
# Account personale (predefinito)
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
# Account di lavoro (Enterprise Managed User aziendale)
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
# Cliente A – lavoro a contratto (Bitbucket)
Host bitbucket-clienta
HostName bitbucket.org
User git
IdentityFile ~/.ssh/id_ed25519_clienta
IdentitiesOnly yes
# Cliente B – progetto in sede (Bitbucket)
Host bitbucket-clientb
HostName bitbucket.org
User git
IdentityFile ~/.ssh/id_ed25519_clientb
IdentitiesOnly yes
# Contributi OSS (GitLab)
Host gitlab-oss
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_ed25519_oss
IdentitiesOnly yes
Impostazioni dell'estensione
{
"gitIdSwitcher.identities": [
{
"id": "personal",
"name": "Andrea Rossi",
"email": "andrea@personal.example.com",
"service": "GitHub",
"icon": "🏠",
"description": "Progetti personali",
"sshKeyPath": "~/.ssh/id_ed25519_personal",
"sshHost": "github-personal",
"gpgKeyId": "ABCD1234EF567890"
},
{
"id": "work-main",
"name": "Andrea Rossi",
"email": "andrea.rossi@techcorp.example.com",
"service": "GitHub Lavoro",
"icon": "💼",
"description": "TechCorp lavoro principale",
"sshKeyPath": "~/.ssh/id_ed25519_work",
"sshHost": "github-work",
"gpgKeyId": "9876543210FEDCBA"
},
{
"id": "client-a",
"name": "Andrea Rossi",
"email": "andrea@clienta.example.com",
"service": "Bitbucket",
"icon": "🏢",
"description": "ClientA contratto",
"sshKeyPath": "~/.ssh/id_ed25519_clienta",
"sshHost": "bitbucket-clienta"
},
{
"id": "client-b",
"name": "A.Rossi",
"email": "a.rossi@clientb.example.com",
"service": "Bitbucket",
"icon": "🏭",
"description": "ClientB in sede",
"sshKeyPath": "~/.ssh/id_ed25519_clientb",
"sshHost": "bitbucket-clientb"
},
{
"id": "oss",
"name": "andrea-dev",
"email": "andrea.dev@example.com",
"service": "GitLab",
"icon": "🌟",
"description": "Contributi OSS",
"sshKeyPath": "~/.ssh/id_ed25519_oss",
"sshHost": "gitlab-oss"
}
],
"gitIdSwitcher.defaultIdentity": "personal",
"gitIdSwitcher.autoSwitchSshKey": true,
"gitIdSwitcher.applyToSubmodules": true
}
Nota: Il 4° profilo (client-b) usa un nome abbreviato e il 5° (oss) un handle da sviluppatore. Puoi impostare nomi visualizzati diversi per ogni profilo, anche per la stessa persona.
Gestione Profili
Clicca sulla barra di stato → "Gestione Profili" in fondo alla lista per aprire la schermata di gestione. Puoi aggiungere, modificare, eliminare e riordinare i profili direttamente dall'interfaccia.
Puoi anche eliminare profili dalla palette comandi con Git ID Switcher: Delete Identity.
Comandi
| Comando | Descrizione |
|---|---|
Git ID Switcher: Select Identity | Apri il selettore profili |
Git ID Switcher: Delete Identity | Elimina un profilo |
Git ID Switcher: Show Current Identity | Mostra informazioni sul profilo attuale |
Git ID Switcher: Show Documentation | Mostra la documentazione |
Riferimento Configurazione
Proprietà del Profilo
| Proprietà | Richiesto | Descrizione |
|---|---|---|
id | ✅ | Identificatore unico (es: "personal", "work") |
name | ✅ | Git user.name — mostrato nei commit |
email | ✅ | Git user.email — mostrato nei commit |
icon | Emoji mostrato nella barra di stato (es: "🏠"). Solo un singolo emoji | |
service | Nome del servizio (es: "GitHub", "GitLab"). Usato per la visualizzazione UI | |
description | Breve descrizione mostrata nel selettore e tooltip | |
sshKeyPath | Percorso della chiave SSH privata (es: "~/.ssh/id_ed25519_work") | |
sshHost | Alias host dalla configurazione SSH (es: "github-work") | |
gpgKeyId | ID chiave GPG per la firma dei commit |
Limitazioni di Visualizzazione
- Barra di stato: Il testo che supera ~25 caratteri verrà troncato con
... icon: È consentito solo un singolo emoji (cluster di grafemi). Emoji multipli o stringhe lunghe non sono supportati
Impostazioni Globali
| Impostazione | Predefinito | Descrizione |
|---|---|---|
gitIdSwitcher.identities | Vedi esempio | Lista delle configurazioni profilo |
gitIdSwitcher.defaultIdentity | Vedi esempio | ID del profilo predefinito da usare |
gitIdSwitcher.autoSwitchSshKey | true | Cambia automaticamente la chiave SSH al cambio profilo |
gitIdSwitcher.showNotifications | true | Mostra notifica al cambio profilo |
gitIdSwitcher.applyToSubmodules | true | Propaga il profilo ai sottomoduli Git |
gitIdSwitcher.submoduleDepth | 1 | Profondità massima per i sottomoduli annidati (1-5) |
gitIdSwitcher.includeIconInGitConfig | false | Includi l'emoji icona nel Git config user.name |
gitIdSwitcher.syncCheck.enabled | true | Verifica se il profilo selezionato corrisponde alla configurazione git effettiva |
gitIdSwitcher.syncCheck.onFocusReturn | true | Esegui sync check quando la finestra dell'editor riacquista il focus |
gitIdSwitcher.logging.fileEnabled | false | Salva log di audit su file (cambio profilo, operazioni chiavi SSH, ecc.) |
gitIdSwitcher.logging.filePath | "" | Percorso file di log (es: ~/.git-id-switcher/security.log). Vuoto = posizione predefinita |
gitIdSwitcher.logging.maxFileSize | 10485760 | Dimensione massima file prima della rotazione (byte, 1MB-100MB) |
gitIdSwitcher.logging.maxFiles | 5 | Numero massimo di file di log ruotati da mantenere (1-20) |
gitIdSwitcher.logging.redactAllSensitive | false | Quando abilitato, maschera tutti i valori nei log (modalità massima privacy) |
gitIdSwitcher.logging.level | "INFO" | Livello di verbosità log (DEBUG, INFO, WARN, ERROR, SECURITY). Registra il livello selezionato e superiori |
gitIdSwitcher.commandTimeouts | {} | Timeout personalizzato per comando (ms, 1sec-5min). Es: {"git": 15000, "ssh-add": 10000} |
Informazioni su includeIconInGitConfig
Controlla il comportamento quando il campo icon è impostato:
| Valore | Comportamento |
|---|---|
false (predefinito) | icon viene mostrato solo nell'interfaccia editor. Solo name viene scritto in Git config |
true | icon + name viene scritto in Git config. L'emoji appare nella cronologia dei commit |
Esempio: icon: "👤", name: "Andrea Rossi"
| includeIconInGitConfig | Git config user.name | Firma del commit |
|---|---|---|
false | Andrea Rossi | Andrea Rossi <email> |
true | 👤 Andrea Rossi | 👤 Andrea Rossi <email> |
Come Funziona
Struttura a Livelli di Git Config
La configurazione Git ha tre livelli, dove i livelli inferiori sovrascrivono quelli superiori:
Sistema (/etc/gitconfig)
↓ sovrascrive
Globale (~/.gitconfig)
↓ sovrascrive
Locale (.git/config) ← massima priorità
Git ID Switcher scrive in --local (locale al repository).
Questo significa:
- Salva il profilo nel
.git/configdi ogni repository - Puoi mantenere profili diversi per ogni repository
- Le impostazioni globali (
~/.gitconfig) non vengono modificate
Quando Cambi Profilo
Quando cambi profilo, l'estensione esegue (in ordine):
- Git Config (sempre): Imposta
git config --local user.nameeuser.email - Chiave SSH (se
sshKeyPathimpostato): Rimuove altre chiavi da ssh-agent, aggiunge quella selezionata - Chiave GPG (se
gpgKeyIdimpostato): Impostagit config --local user.signingkeye abilita la firma - Sottomoduli (se abilitato): Propaga la configurazione a tutti i sottomoduli (predefinito: profondità 1)
- Sync Check: Verifica che il profilo applicato corrisponda alla configurazione git effettiva
Sync Check
Confronta il profilo selezionato con i valori effettivi di git config --local (user.name, user.email, user.signingkey) e mostra un avviso nella barra di stato quando viene rilevata una discrepanza.
Quando vengono eseguiti i controlli:
- Subito dopo l'applicazione del profilo
- Al cambio della cartella del workspace
- Al cambio di configurazione
- Quando la finestra dell'editor riacquista il focus (con debounce di 500 ms)
Quando viene rilevata una discrepanza:
- La barra di stato mostra un'icona ⚠️ con un colore di sfondo di avviso
- Il tooltip mostra una tabella con i campi discordanti (campo, valore atteso, valore effettivo)
- Cliccando sulla barra di stato vengono presentate le opzioni di risoluzione:
- Riapplica profilo — Riapplica il profilo corrente alla configurazione git
- Seleziona un profilo diverso — Apri il selettore profili
- Ignora — Sopprime l'avviso fino al prossimo controllo
Per disabilitare:
Imposta gitIdSwitcher.syncCheck.enabled su false per disabilitare tutti i sync check.
Per disabilitare solo il controllo al ritorno del focus, imposta gitIdSwitcher.syncCheck.onFocusReturn su false.
Come Funziona la Propagazione ai Sottomoduli
Le impostazioni locali sono per repository, quindi non si applicano automaticamente ai sottomoduli. Ecco perché questa estensione fornisce la propagazione ai sottomoduli (vedi "Avanzato: Supporto Sottomoduli" per i dettagli).
Dettagli sulla Gestione delle Chiavi SSH
Git ID Switcher gestisce le chiavi SSH tramite ssh-agent:
| Operazione | Comando eseguito |
|---|---|
| Aggiungi chiave | ssh-add <keyPath> |
| Rimuovi chiave | ssh-add -d <keyPath> |
| Lista chiavi | ssh-add -l |
Importante: Questa estensione non modifica ~/.ssh/config. Devi configurare SSH manualmente (vedi Passo 2 in "Avvio Rapido").
Interazione con Configurazioni SSH Esistenti
Se hai già configurazioni SSH, Git ID Switcher funziona così:
| La tua configurazione | Comportamento di Git ID Switcher |
|---|---|
~/.ssh/config specifica IdentityFile | Entrambi utilizzabili; IdentitiesOnly yes previene conflitti |
Variabile d'ambiente GIT_SSH_COMMAND | Usa comando SSH personalizzato; ssh-agent continua a funzionare |
git config core.sshCommand impostato | Come sopra |
| direnv imposta variabili d'ambiente SSH | Coesistono; ssh-agent funziona indipendentemente |
Raccomandazione: Imposta sempre IdentitiesOnly yes nella tua configurazione SSH. Questo impedisce a SSH di provare più chiavi.
Perché IdentitiesOnly yes?
Senza questa impostazione, SSH potrebbe provare le chiavi in questo ordine:
- Chiavi caricate in ssh-agent (gestite da Git ID Switcher)
- Chiavi specificate in
~/.ssh/config - Chiavi predefinite (
~/.ssh/id_rsa,~/.ssh/id_ed25519, ecc.)
Questo può causare errori di autenticazione o l'uso involontario della chiave sbagliata.
Con IdentitiesOnly yes, SSH usa solo la chiave specificata. Questo assicura che venga usata la chiave impostata da Git ID Switcher.
# Configurazione raccomandata
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes # ← Questa riga è importante
Con questa configurazione, quando ti connetti all'host github-work, verrà usata solo ~/.ssh/id_ed25519_work, e nessun'altra chiave verrà provata.
Avanzato: Supporto Sottomoduli
Per repository complessi che usano sottomoduli Git, la gestione dei profili è spesso problematica. Quando fai commit in un sottomodulo, Git usa la configurazione locale di quel sottomodulo, che potrebbe usare la configurazione globale (email sbagliata!) se non impostata esplicitamente.
Git ID Switcher rileva automaticamente i sottomoduli e applica il profilo selezionato.
{
"gitIdSwitcher.applyToSubmodules": true,
"gitIdSwitcher.submoduleDepth": 1
}
applyToSubmodules: Abilita/disabilita questa funzionalitàsubmoduleDepth: Fino a che profondità applicare?1: Solo sottomoduli diretti (più comune)2+: Sottomoduli annidati (sottomoduli dentro sottomoduli)
Questo assicura che il tuo profilo sia sempre corretto, sia che tu faccia commit nel repository principale che in una libreria vendor.
Risoluzione Problemi
La chiave SSH non cambia?
-
Assicurati che
ssh-agentsia in esecuzione:eval "$(ssh-agent -s)" -
Verifica che il percorso della chiave sia corretto:
ls -la ~/.ssh/id_ed25519_* -
Su macOS, aggiungi al Portachiavi una volta:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_work
Profilo sbagliato durante il push?
Per nuovi clone:
Quando cloni repository di lavoro, usa l'alias host configurato in SSH config:
# Lavoro (usa alias github-work)
git clone git@github-work:company/repo.git
# Personale (usa github.com predefinito)
git clone git@github.com:tuoutente/repo.git
Per repository esistenti:
-
Verifica che l'URL remoto usi l'alias host corretto:
git remote -v # Per repository di lavoro dovrebbe mostrare git@github-work:... -
Aggiorna se necessario:
git remote set-url origin git@github-work:company/repo.git
La firma GPG non funziona?
-
Trova il tuo ID chiave GPG:
gpg --list-secret-keys --keyid-format SHORT -
Testa la firma:
echo "test" | gpg --clearsign -
Assicurati che l'email nel profilo corrisponda all'email della chiave GPG
Profilo non rilevato?
- Assicurati di essere in un repository Git
- Verifica che
settings.jsonnon abbia errori di sintassi - Ricarica la finestra di VS Code (
Cmd+Shift+P→ "Ricarica finestra")
Errore con il campo name?
I seguenti caratteri nel campo name causeranno un errore:
` $ ( ) { } | & < >
Usa il campo service se vuoi includere informazioni sul servizio.
// NG
"name": "Andrea Rossi (Personale)"
// OK
"name": "Andrea Rossi",
"service": "GitHub"
Le nuove impostazioni non appaiono?
Dopo l'aggiornamento dell'estensione, le nuove impostazioni potrebbero non apparire nell'interfaccia delle impostazioni.
Soluzione: Riavvia completamente il computer.
Editor come VS Code memorizzano lo schema delle impostazioni in memoria, e "Ricarica finestra" o reinstallare l'estensione potrebbe non essere sufficiente per aggiornarlo.
I valori predefiniti (identities, ecc.) sono vuoti?
Se le impostazioni di esempio non appaiono neanche dopo una nuova installazione, Settings Sync potrebbe essere la causa.
Se in precedenza hai salvato impostazioni vuote, potrebbero essersi sincronizzate sul cloud e stanno sovrascrivendo i valori predefiniti nelle nuove installazioni.
Soluzione:
- Trova l'impostazione nell'interfaccia delle impostazioni
- Clicca sull'icona dell'ingranaggio → "Reimposta impostazione"
- Sincronizza con Settings Sync (questo rimuove le vecchie impostazioni dal cloud)
Filosofia di Design
"Chi sono io" — L'unica domanda a cui risponde questa estensione
Costruita sull'Architettura Karesansui. Il nucleo può essere scritto in 100 righe. Ecco perché il resto può essere dedicato alla qualità (90% test, logging, timeout) e a vincoli intenzionali (nessuna integrazione API GitHub, nessuna gestione token).
Leggi la filosofia di design completa
Contribuire
I contributi sono benvenuti! Consulta CONTRIBUTING.md.
Licenza
Licenza MIT — vedi LICENSE.
Crediti
Creato da Null;Variant