Git ID Switcher

May 8, 2026 · View on GitHub

Git ID Switcher Passa tra più profili Git con un clic. Gestisci più account GitHub, chiavi SSH, firma GPG e applica automaticamente il profilo ai sottomoduli 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 🇺🇸 🇯🇵 🇨🇳 🇹🇼 🇰🇷 🇩🇪 🇫🇷 🇪🇸 🇧🇷 🇮🇹 🇷🇺 🇵🇱 🇹🇷 🇨🇿 🇭🇺 🇧🇬 🇺🇦 🌍 🌺 🐻 🐉 🖖 🐱 🏴‍☠️ 🎭

Demo

🎯 Perché Git ID Switcher?

Esistono molti strumenti per cambiare profilo Git, ma Git ID Switcher risolve problemi complessi che altri spesso trascurano:

  1. L'incubo dei sottomoduli: Quando lavori con repository che hanno sottomoduli (temi Hugo, librerie vendor, ecc.), di solito devi configurare git config user.name manualmente per ogni sottomodulo. Questa estensione lo gestisce elegantemente applicando ricorsivamente il profilo a tutti i sottomoduli attivi.
  2. 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.

Guida alla configurazione iniziale (13 passi): apri la gestione profili dalla barra di stato, modifica e crea nuovi profili

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 gpgKeyId nella 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.

Gestione Profili: guida alle operazioni di eliminazione e riordino

Puoi anche eliminare profili dalla palette comandi con Git ID Switcher: Delete Identity.


Comandi

ComandoDescrizione
Git ID Switcher: Select IdentityApri il selettore profili
Git ID Switcher: Delete IdentityElimina un profilo
Git ID Switcher: Show Current IdentityMostra informazioni sul profilo attuale
Git ID Switcher: Show DocumentationMostra la documentazione

Riferimento Configurazione

Proprietà del Profilo

ProprietàRichiestoDescrizione
idIdentificatore unico (es: "personal", "work")
nameGit user.name — mostrato nei commit
emailGit user.email — mostrato nei commit
iconEmoji mostrato nella barra di stato (es: "🏠"). Solo un singolo emoji
serviceNome del servizio (es: "GitHub", "GitLab"). Usato per la visualizzazione UI
descriptionBreve descrizione mostrata nel selettore e tooltip
sshKeyPathPercorso della chiave SSH privata (es: "~/.ssh/id_ed25519_work")
sshHostAlias host dalla configurazione SSH (es: "github-work")
gpgKeyIdID 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

ImpostazionePredefinitoDescrizione
gitIdSwitcher.identitiesVedi esempioLista delle configurazioni profilo
gitIdSwitcher.defaultIdentityVedi esempioID del profilo predefinito da usare
gitIdSwitcher.autoSwitchSshKeytrueCambia automaticamente la chiave SSH al cambio profilo
gitIdSwitcher.showNotificationstrueMostra notifica al cambio profilo
gitIdSwitcher.applyToSubmodulestruePropaga il profilo ai sottomoduli Git
gitIdSwitcher.submoduleDepth1Profondità massima per i sottomoduli annidati (1-5)
gitIdSwitcher.includeIconInGitConfigfalseIncludi l'emoji icona nel Git config user.name
gitIdSwitcher.syncCheck.enabledtrueVerifica se il profilo selezionato corrisponde alla configurazione git effettiva
gitIdSwitcher.syncCheck.onFocusReturntrueEsegui sync check quando la finestra dell'editor riacquista il focus
gitIdSwitcher.logging.fileEnabledfalseSalva 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.maxFileSize10485760Dimensione massima file prima della rotazione (byte, 1MB-100MB)
gitIdSwitcher.logging.maxFiles5Numero massimo di file di log ruotati da mantenere (1-20)
gitIdSwitcher.logging.redactAllSensitivefalseQuando 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:

ValoreComportamento
false (predefinito)icon viene mostrato solo nell'interfaccia editor. Solo name viene scritto in Git config
trueicon + name viene scritto in Git config. L'emoji appare nella cronologia dei commit

Esempio: icon: "👤", name: "Andrea Rossi"

includeIconInGitConfigGit config user.nameFirma del commit
falseAndrea RossiAndrea 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/config di 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):

  1. Git Config (sempre): Imposta git config --local user.name e user.email
  2. Chiave SSH (se sshKeyPath impostato): Rimuove altre chiavi da ssh-agent, aggiunge quella selezionata
  3. Chiave GPG (se gpgKeyId impostato): Imposta git config --local user.signingkey e abilita la firma
  4. Sottomoduli (se abilitato): Propaga la configurazione a tutti i sottomoduli (predefinito: profondità 1)
  5. 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:

OperazioneComando eseguito
Aggiungi chiavessh-add <keyPath>
Rimuovi chiavessh-add -d <keyPath>
Lista chiavissh-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 configurazioneComportamento di Git ID Switcher
~/.ssh/config specifica IdentityFileEntrambi utilizzabili; IdentitiesOnly yes previene conflitti
Variabile d'ambiente GIT_SSH_COMMANDUsa comando SSH personalizzato; ssh-agent continua a funzionare
git config core.sshCommand impostatoCome sopra
direnv imposta variabili d'ambiente SSHCoesistono; 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:

  1. Chiavi caricate in ssh-agent (gestite da Git ID Switcher)
  2. Chiavi specificate in ~/.ssh/config
  3. 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?

  1. Assicurati che ssh-agent sia in esecuzione:

    eval "$(ssh-agent -s)"
    
  2. Verifica che il percorso della chiave sia corretto:

    ls -la ~/.ssh/id_ed25519_*
    
  3. 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:

  1. Verifica che l'URL remoto usi l'alias host corretto:

    git remote -v
    # Per repository di lavoro dovrebbe mostrare git@github-work:...
    
  2. Aggiorna se necessario:

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

La firma GPG non funziona?

  1. Trova il tuo ID chiave GPG:

    gpg --list-secret-keys --keyid-format SHORT
    
  2. Testa la firma:

    echo "test" | gpg --clearsign
    
  3. 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.json non 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:

  1. Trova l'impostazione nell'interfaccia delle impostazioni
  2. Clicca sull'icona dell'ingranaggio → "Reimposta impostazione"
  3. 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).

Karesansui Architecture

Leggi la filosofia di design completa


Contribuire

I contributi sono benvenuti! Consulta CONTRIBUTING.md.

Licenza

Licenza MIT — vedi LICENSE.

Crediti

Creato da Null;Variant