Digamos que aliceseja um usuário do github.com, com 2 ou mais repositórios particulares repoN. Neste exemplo, trabalharemos com apenas dois repositórios nomeados repo1erepo2
https://github.com/alice/repo1
https://github.com/alice/repo2
Você precisa extrair esses repositórios sem inserir uma senha provavelmente em um servidor ou em vários servidores. Você deseja executar, git pull origin masterpor exemplo, e deseja que isso aconteça sem solicitar uma senha.
Você não gosta de lidar com o ssh-agent, descobriu (ou está descobrindo agora) sobre ~/.ssh/configum arquivo que informa ao seu cliente ssh qual chave privada usar, dependendo do nome do host e do nome de usuário, com uma entrada de configuração simples que se parece com isto:
Host github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/alice_github.id_rsa
IdentitiesOnly yes
Então você foi em frente e criou seu (alice_github.id_rsa, alice_github.id_rsa.pub)par de chaves, depois também foi para o .git/configarquivo do seu repositório e modificou o URL do seu controle remoto originpara algo como:
[remote "origin"]
url = "ssh://git@github.com/alice/repo1.git"
E, finalmente, você foi à Settings > Deploy keysseção de repositório e adicionou o conteúdo dealice_github.id_rsa.pub
Neste ponto, você pode fazer o seu git pull origin mastersem inserir uma senha sem problemas.
mas e o segundo repositório?
Portanto, seu instinto será pegar a chave e adicioná-la às repo2chaves Deploy, mas o github.com cometerá um erro e informará que a chave já está sendo usada.
Agora você gera outra chave (usando ssh-keygen -t rsa -C "alice@alice.com"sem senhas, é claro) e, para que isso não se torne uma bagunça, você irá nomear suas chaves assim:
repo1 par de chaves: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
repo2 par de chaves: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)
Agora você colocará a nova chave pública na repo2configuração do Deploy keys no github.com, mas agora você tem um problema com o ssh.
Como o ssh pode dizer qual chave usar se os repositórios estiverem hospedados no mesmo github.comdomínio?
Seu .ssh/configarquivo aponta github.come ele não sabe qual chave usar na hora de fazer o pull.
Então, encontrei um truque no github.com. Você pode dizer ao seu cliente ssh que cada repositório vive em um subdomínio diferente do github.com; nesses casos, eles serão repo1.github.comerepo2.github.com
Então, a primeira coisa é editar os .git/configarquivos nos seus clones de repositório, para que eles fiquem assim:
Para repo1
[remote "origin"]
url = "ssh://git@repo1.github.com/alice/repo1.git"
Para repo2
[remote "origin"]
url = "ssh://git@repo2.github.com/alice/repo2.git"
E então, no seu .ssh/configarquivo, agora você poderá inserir uma configuração para cada subdomínio :)
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
Agora você pode, git pull origin mastersem inserir nenhuma senha dos dois repositórios.
Se você tiver várias máquinas, poderá copiar as chaves de cada uma delas e reutilizá-las, mas recomendo que trabalhe com as pernas para gerar 1 chave por máquina e repo. Você terá muito mais chaves para lidar, mas ficará menos vulnerável se uma delas for comprometida.