Come configurare SSH per gestire due account GitHub sullo stesso computer

keyboard mac vectorial image

Se hai due account GitHub — ad esempio uno personale e uno aziendale — e provi a configurarli entrambi nel file ~/.ssh/config in questo modo, avrai un problema:

Host github.com
    User git
    HostName github.com
    IdentityFile "C:\Users\marco\.ssh\github_lavoro"

Host github.com
    User git
    HostName github.com
    IdentityFile "C:\Users\marco\.ssh\github_personale"

SSH legge il file dall’alto verso il basso e si ferma al primo blocco che corrisponde all’host cercato. Il secondo account viene ignorato.

La soluzione: usare alias diversi

Basta assegnare un nome alias al secondo blocco. L’alias è arbitrario, ma deve essere diverso da github.com. La riga HostName si occuperà comunque di puntare al server corretto.

Host github.com
    User git
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile "C:\Users\marco\.ssh\github_lavoro"

Host github-personale
    User git
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile "C:\Users\marco\.ssh\github_personale"

Verificare che funzioni

Testa la connessione per entrambi gli account:

ssh -T git@github.com
# Hi marco-lavoro! You've successfully authenticated...

ssh -T git@github-personale
# Hi marco-personale! You've successfully authenticated...

Usare il secondo account nei repository

Ogni volta che lavori con un repo del secondo account, devi usare l’alias al posto di github.com nell’URL remoto.

Clonare un nuovo repository:

git clone git@github-personale:marco-personale/mio-progetto.git

Aggiornare un repository già clonato:

git remote set-url origin git@github-personale:marco-personale/mio-progetto.git

Puoi verificare l’URL remoto attuale con:

git remote -v

Attenzione: HTTPS vs SSH

C’è un caso in cui tutto quanto visto finora non funziona: quando il remote del repository usa HTTPS invece di SSH.

Verifica il protocollo con git remote -v. Se l’output assomiglia a questo:

origin  https://github.com/marco-personale/mio-progetto.git (fetch)
origin  https://github.com/marco-personale/mio-progetto.git (push)

significa che Git sta usando HTTPS, e il file ~/.ssh/config viene completamente ignorato. Non importa quanto tu abbia configurato gli alias SSH: il push andrà sempre sull’account sbagliato.

La soluzione è convertire il remote da HTTPS a SSH:

git remote set-url origin git@github-personale:marco-personale/mio-progetto.git

Verifica che la modifica sia andata a buon fine:

git remote -v
# origin  git@github-personale:marco-personale/mio-progetto.git (fetch)
# origin  git@github-personale:marco-personale/mio-progetto.git (push)

Da questo momento git push userà SSH con la chiave corretta del secondo account.


Il primo account continua a funzionare esattamente come prima, senza modifiche ai repository esistenti.