Magit si connette a GitHub con una chiave ssh alternativa

Jan 12 2021

Ho due account GitHub: uno personale e uno per il mio lavoro. Nella maggior parte dei miei repository, utilizzo il mio account di lavoro e magit funziona bene. In un paio di repository personali, ho questo in .git/config:

sshCommand = ssh -i /my/home/directory/.ssh/personal/id_rsa -F /dev/null

Funziona bene dalla riga di comando per cose come git push, ma quando provo a eseguire il push da magit, ottengo questo errore:

ERROR: Permission to <personalaccount>/unified_docs_switcher.git denied to <workaccount>.

Poiché il mio account di lavoro è menzionato nel messaggio di errore, sembra che la connessione di magit a git stia ignorando la linea in .git/config.

C'è qualche altra configurazione che posso aggiungere a Magit per riconoscerla?

Esiste una soluzione diversa / migliore in Magit per l'utilizzo di account GitHub diversi?

(Modifica: emacs 27.1 su MacOS da qui , testato su magit 2.90.1 da melpa-stable e poi 20210105.1030 da melpa)

Risposte

3 jidicula Jan 24 2021 at 09:09

C'è una soluzione Git pura che puoi usare nel tuo globale .gitconfig: io uso una include.pathconfigurazione per cose personali per impostazione predefinita:

# .gitconfig
# default user email and key
[include]
        path = .gitconfig-personal

e quel file contiene il nome, l'email personale (che viene utilizzata per SSH e l'identificazione del mio account GitHub) e l'ID della chiave GPG:

# .gitconfig-personal
[user]
    name = jidicula
    email = "[email protected]"
    signingkey = "<personalKeyID>"

Quindi, sotto quella prima [include]nel mio globale .gitconfig, ho una includeIf.pathconfigurazione di lavoro da utilizzare se il repository corrisponde a un modello fornito come argomento per includeIf:

# .gitconfig
# When working with Work
[includeIf "gitdir:**/work/**/.git"]
        path = .gitconfig-work

e quel file contiene il nome, l'email di lavoro e l'ID chiave GPG dell'email di lavoro:

# .gitconfig-work
[user]
        name = jidicula
        email = "[email protected]"
        signingkey = "<workKeyID>"

Qualunque cosa in questa seconda configurazione sovrascriverà qualsiasi cosa sia stata definita per impostazione predefinita - in coppia con il condizionale includeIf, otteniamo la configurazione Git dipendente dal percorso.

Mettendo .gitconfiginsieme il globale , otteniamo:

# .gitconfig
# default user email and key
[include]
        path = .gitconfig-personal
# When working with Work
[includeIf "gitdir:**/work/**/.git"]
        path = .gitconfig-work

Quindi riempirai .gitconfig-personale gitconfig-workcon le tue configurazioni specifiche del contesto come e-mail, chiavi, nomi utente, comportamento di pull, modelli di messaggi di commit, ecc.

Puoi leggere di più sugli include condizionali qui .