|
|
Passa tra più identità Git con un clic. Gestisci più account GitHub, chiavi SSH, firma GPG e applica automaticamente l'identità ai sottomoduli Git.
|
Sebbene esistano molti strumenti per cambiare identità Git, Git ID Switcher risolve problemi complessi che altri spesso ignorano:
- L'incubo dei sottomoduli: Quando si lavora con repository che hanno sottomoduli (temi Hugo, librerie vendor, ecc.), di solito bisogna configurare
git config user.namemanualmente per ogni sottomodulo. Questa estensione lo gestisce elegantemente applicando ricorsivamente la tua identità a tutti i sottomoduli attivi. - Gestione SSH e GPG: Non cambia solo il tuo nome; scambia anche le tue chiavi SSH nell'agent e configura la firma GPG in modo che tu non faccia mai commit con la firma sbagliata.
- Supporto sottomoduli: Propaga automaticamente l'identità 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)
- Cambio identità con un clic: Cambia Git user.name e user.email istantaneamente
- Integrazione barra di stato: Visualizza sempre la tua identità corrente a colpo d'occhio
- Tooltip dettagliati: Informazioni complete con descrizione e host SSH
- Multipiattaforma: Funziona su macOS, Linux e Windows
- Multilingue: Supporta 17 lingue
Valorizzo l'esistenza delle minoranze. Non voglio scartarle solo perché sono poche di numero. 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 VSCode. 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.
Una configurazione tipica per gestire un account personale e un account di lavoro (Enterprise Managed User).
Prima, crea le chiavi SSH per ogni account (salta se le hai già):
# Personale
ssh-keygen -t ed25519 -C "andrea.rossi@personal.example.com" -f ~/.ssh/id_ed25519_personal
# Lavoro
ssh-keygen -t ed25519 -C "andrea.rossi@company.example.com" -f ~/.ssh/id_ed25519_workRegistra la chiave pubblica (file .pub) di ogni chiave sull'account GitHub corrispondente.
Nota: Su GitHub registra
id_ed25519_personal.pub(chiave pubblica).id_ed25519_personal(senza estensione) è la chiave privata - non condividerla mai e non caricarla da nessuna parte.
Modifica ~/.ssh/config:
# Account GitHub personale (predefinito)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
# Account GitHub di lavoro (Enterprise Managed User fornito dall'azienda)
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yesApri le impostazioni dell'estensione (Cmd+, / Ctrl+,) → cerca "Git ID Switcher" → clicca su "Modifica in settings.json":
{
"gitIdSwitcher.identities": [
{
"id": "personal",
"name": "Andrea Rossi",
"email": "andrea.rossi@personal.example.com",
"service": "GitHub",
"icon": "🏠",
"description": "Progetti personali",
"sshKeyPath": "~/.ssh/id_ed25519_personal"
},
{
"id": "work",
"name": "Andrea Rossi",
"email": "andrea.rossi@company.example.com",
"service": "GitHub Lavoro",
"icon": "💼",
"description": "Account di lavoro",
"sshKeyPath": "~/.ssh/id_ed25519_work",
"sshHost": "github-work"
}
],
"gitIdSwitcher.defaultIdentity": "personal",
"gitIdSwitcher.autoSwitchSshKey": true,
"gitIdSwitcher.applyToSubmodules": true
}- Clicca sull'icona dell'identità nella barra di stato (in basso a destra)
- Seleziona un'identità
- Fatto! La configurazione Git e la chiave SSH sono ora cambiate.
Quando cloni i repository, usa l'host che corrisponde alla tua identità:
# Per l'identità di lavoro (usa l'alias github-work)
git clone git@github-work:company/repo.git
# Per l'identità personale (usa github.com predefinito)
git clone git@github.com:arossi/repo.gitSe firmi i commit con GPG:
gpg --list-secret-keys --keyid-format SHORTEsempio di output:
sec ed25519/ABCD1234 2024-01-01 [SC]
...
uid [ultimate] Andrea Rossi <andrea.rossi@personal.example.com>
L'ID della chiave è ABCD1234.
{
"gitIdSwitcher.identities": [
{
"id": "personal",
"name": "Andrea Rossi",
"email": "andrea.rossi@personal.example.com",
"service": "GitHub",
"icon": "🏠",
"description": "Progetti personali",
"sshKeyPath": "~/.ssh/id_ed25519_personal",
"gpgKeyId": "ABCD1234"
}
]
}Quando passi a questa identità, l'estensione configura:
git config user.signingkey ABCD1234git config commit.gpgsign true
Ecco un esempio completo che combina tutto:
# Account personale (predefinito)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
# Account di lavoro (Enterprise Managed User fornito dall'azienda)
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
# Account Bitbucket
Host bitbucket.org
HostName bitbucket.org
User git
IdentityFile ~/.ssh/id_ed25519_bitbucket
IdentitiesOnly yes{
"gitIdSwitcher.identities": [
{
"id": "personal",
"name": "Andrea Rossi",
"email": "andrea.rossi@personal.example.com",
"service": "GitHub",
"icon": "🏠",
"description": "Progetti personali",
"sshKeyPath": "~/.ssh/id_ed25519_personal",
"gpgKeyId": "PERSONAL1"
},
{
"id": "work",
"name": "Andrea Rossi",
"email": "andrea.rossi@company.example.com",
"service": "GitHub Lavoro",
"icon": "💼",
"description": "Account di lavoro",
"sshKeyPath": "~/.ssh/id_ed25519_work",
"sshHost": "github-work",
"gpgKeyId": "WORK1234"
},
{
"id": "bitbucket",
"name": "arossi-bb",
"email": "arossi.bb@example.com",
"service": "Bitbucket",
"icon": "🪣",
"description": "Progetti Bitbucket",
"sshKeyPath": "~/.ssh/id_ed25519_bitbucket",
"sshHost": "bitbucket.org"
},
{
"id": "freelance",
"name": "Andrea Rossi",
"email": "andrea.rossi@freelance.example.com",
"service": "GitLab",
"icon": "🎯",
"description": "Progetti freelance"
}
],
"gitIdSwitcher.defaultIdentity": "personal",
"gitIdSwitcher.autoSwitchSshKey": true,
"gitIdSwitcher.applyToSubmodules": true
}Nota: L'ultima identità (freelance) non ha SSH — cambia solo la configurazione Git. Questo è utile quando usi informazioni committer diverse con lo stesso account GitHub.
| Proprietà | Richiesto | Descrizione |
|---|---|---|
id |
✅ | Identificatore unico (es: "work", "personal") |
name |
✅ | Git user.name - mostrato nei commit |
email |
✅ | Git user.email - mostrato nei commit |
icon |
Emoji mostrato nella barra di stato (es.: "🏠"). Solo un 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 SSH (es: "github-work") |
|
gpgKeyId |
ID chiave GPG per firmare i commit |
- Barra di stato: Il testo che supera ~25 caratteri verrà troncato con
... icon: È consentito solo un singolo emoji (cluster di grafemi). Non sono supportati emoji multipli o stringhe lunghe
| Impostazione | Predefinito | Descrizione |
|---|---|---|
gitIdSwitcher.identities |
Vedi esempio | Lista delle configurazioni identità |
gitIdSwitcher.defaultIdentity |
Vedi esempio | ID dell'identità predefinita |
gitIdSwitcher.autoSwitchSshKey |
true |
Cambia automaticamente la chiave SSH |
gitIdSwitcher.showNotifications |
true |
Mostra notifica al cambio identità |
gitIdSwitcher.applyToSubmodules |
true |
Propaga identità ai sottomoduli Git |
gitIdSwitcher.submoduleDepth |
1 |
Profondità max per sottomoduli annidati (1-5) |
gitIdSwitcher.includeIconInGitConfig |
false |
Includi emoji icona nel Git config user.name |
gitIdSwitcher.logging.fileEnabled |
false |
Abilita log di audit (cambio identità, operazioni SSH, ecc.) |
gitIdSwitcher.logging.filePath |
"" |
Percorso file di log (es.: ~/.git-id-switcher/security.log). Vuoto = posizione predefinita |
gitIdSwitcher.logging.maxFileSize |
10485760 |
Dimensione max file prima della rotazione (byte, 1MB-100MB) |
gitIdSwitcher.logging.maxFiles |
5 |
Num. max file di log in rotazione (1-20) |
gitIdSwitcher.logging.level |
"INFO" |
Livello log: DEBUG/INFO/WARN/ERROR/SECURITY. Registra il livello selezionato e superiori |
gitIdSwitcher.logging.redactAllSensitive |
false |
Quando abilitato, tutti i valori vengono mascherati nei log (massima privacy) |
gitIdSwitcher.commandTimeouts |
{} |
Timeout personalizzato per comando (ms, 1sec-5min). Es.: {"git": 15000, "ssh-add": 10000} |
Controlla il comportamento quando il campo icon è impostato:
| Valore | Comportamento |
|---|---|
false (predefinito) |
icon viene mostrato solo nell'interfaccia dell'editor. Solo name viene scritto nella config Git |
true |
icon + name viene scritto nella config Git. 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> |
Se non hai bisogno di cambiare chiavi SSH (es: usando informazioni committer diverse con un singolo account GitHub), puoi usare una configurazione minima:
{
"gitIdSwitcher.identities": [
{
"id": "personal",
"name": "Andrea Rossi",
"email": "andrea.rossi@personal.example.com",
"icon": "🏠",
"description": "Progetti personali"
},
{
"id": "work",
"name": "Andrea Rossi",
"email": "andrea.rossi@company.example.com",
"icon": "💼",
"description": "Account di lavoro"
}
]
}Questa configurazione cambia solo git config user.name e user.email.
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:
- L'identità viene salvata nel
.git/configdi ogni repository - Si possono mantenere identità diverse per ogni repository
- Le impostazioni globali (
~/.gitconfig) non vengono modificate
Quando cambi identità, l'estensione esegue (in ordine):
- Configurazione Git (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)
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).
Per repository complessi che usano sottomoduli Git, la gestione dell'identità è spesso problematica. Se 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 loro l'identità selezionata.
{
"gitIdSwitcher.applyToSubmodules": true,
"gitIdSwitcher.submoduleDepth": 1
}applyToSubmodules: Abilita/disabilita questa funzionesubmoduleDepth: Quanto in profondità andare?1: Solo sottomoduli diretti (più comune)2+: Sottomoduli annidati (sottomoduli dentro sottomoduli)
Questo assicura che la tua identità sia sempre corretta, sia che tu faccia commit nel repo principale che in una libreria vendor.
-
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
-
Verifica che l'URL remoto usi l'alias host corretto:
git remote -v # Dovrebbe mostrare git@github-work:... per i repo di lavoro -
Aggiorna se necessario:
git remote set-url origin git@github-work:company/repo.git
-
Trova il tuo ID chiave GPG:
gpg --list-secret-keys --keyid-format SHORT
-
Testa la firma:
echo "test" | gpg --clearsign
-
Assicurati che l'email nella tua identità corrisponda all'email della chiave GPG.
- 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")
I seguenti caratteri nel campo name causeranno un errore:
` $ ( ) { } | & < >
Usa il campo service se vuoi includere informazioni sul servizio.
Dopo l'aggiornamento dell'estensione, le nuove impostazioni potrebbero non apparire nell'interfaccia delle impostazioni.
Soluzione: Riavvia completamente il computer.
Gli editor basati su VS Code memorizzano nella cache lo schema delle impostazioni in memoria, e "Ricarica finestra" o reinstallare l'estensione potrebbe non essere sufficiente per aggiornarlo.
Se le impostazioni di esempio non appaiono anche 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)
| Comando | Descrizione |
|---|---|
Git ID Switcher: Select Identity |
Apri il selettore di identità |
Git ID Switcher: Show Current Identity |
Mostra info sull'identità attuale |
Git ID Switcher: Show Documentation |
Mostra documentazione |
"Chi sono io?" — L'unica domanda a cui risponde questa estensione.
Costruita sull'Architettura Karesansui: un nucleo semplice (100 righe), circondato da qualità deliberata (90% copertura, logging, timeout) e vincoli intenzionali (nessuna API GitHub, nessuna gestione token).
I contributi sono benvenuti! Vedi CONTRIBUTING.md.
Licenza MIT - vedi LICENSE.
Creato da Null;Variant

