Diciamo che alice
è un utente github.com, con 2 o più repository privati repoN
. Per questo esempio lavoreremo con solo due repository denominati repo1
erepo2
https://github.com/alice/repo1
https://github.com/alice/repo2
Devi essere in grado di estrarre da questi repository senza inserire una password probabilmente su un server o su più server. Ad git pull origin master
esempio, vuoi esibirti e vuoi che ciò accada senza chiedere una password.
Non ti piace trattare con ssh-agent, hai scoperto (o lo stai scoprendo ora) su ~/.ssh/config
un file che consente al tuo client ssh di sapere quale chiave privata utilizzare in base al nome host e al nome utente, con una semplice voce di configurazione che assomiglia Questo:
Host github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/alice_github.id_rsa
IdentitiesOnly yes
Quindi sei andato avanti e hai creato la tua (alice_github.id_rsa, alice_github.id_rsa.pub)
coppia di chiavi, poi sei anche andato al .git/config
file del tuo repository e hai modificato l'URL del tuo telecomando origin
per essere qualcosa del genere:
[remote "origin"]
url = "ssh://git@github.com/alice/repo1.git"
E infine sei andato nella Settings > Deploy keys
sezione del repository e hai aggiunto il contenuto dialice_github.id_rsa.pub
A questo punto potresti fare il tuo git pull origin master
senza inserire una password senza problemi.
ma per quanto riguarda il secondo repository?
Quindi il tuo istinto sarà quello di afferrare quella chiave e aggiungerla alle repo2
chiavi di distribuzione, ma github.com sbaglierà e ti dirà che la chiave è già in uso.
Ora vai e generi un'altra chiave (usando ssh-keygen -t rsa -C "alice@alice.com"
ovviamente senza password), e in modo che questo non diventi un disastro, ora nominerai le tue chiavi in questo modo:
repo1
coppia di chiavi: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
repo2
coppia di chiavi: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)
Ora inserirai la nuova chiave pubblica nella repo2
configurazione di distribuzione delle chiavi su github.com, ma ora hai un problema ssh da affrontare.
Come può ssh dire quale chiave usare se i repository sono ospitati sullo stesso github.com
dominio?
Il tuo .ssh/config
file punta github.com
e non sa quale chiave usare quando è il momento di fare il pull.
Quindi ho trovato un trucco con github.com. Puoi dire al tuo client ssh che ogni repository vive in un sottodominio github.com diverso, in questi casi saranno repo1.github.com
erepo2.github.com
Quindi la prima cosa da fare è modificare i .git/config
file sui cloni dei repository, quindi sembrano così:
Per repo1
[remote "origin"]
url = "ssh://git@repo1.github.com/alice/repo1.git"
Per repo2
[remote "origin"]
url = "ssh://git@repo2.github.com/alice/repo2.git"
E poi, sul tuo .ssh/config
file, ora sarai in grado di inserire una configurazione per ciascun sottodominio :)
Host repo1.github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
IdentitiesOnly yes
Host repo2.github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
IdentitiesOnly yes
Ora puoi farlo git pull origin master
senza inserire alcuna password da entrambi i repository.
Se hai più macchine, potresti copiare le chiavi su ciascuna delle macchine e riutilizzarle, ma ti consiglio di fare il lavoro di gamba per generare 1 chiave per macchina e repository. Avrai molte più chiavi da gestire, ma sarai meno vulnerabile se uno viene compromesso.