Digamos que alice
seja um usuário do github.com, com 2 ou mais repositórios particulares repoN
. Neste exemplo, trabalharemos com apenas dois repositórios nomeados repo1
erepo2
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 master
por 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/config
um 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/config
arquivo do seu repositório e modificou o URL do seu controle remoto origin
para algo como:
[remote "origin"]
url = "ssh://git@github.com/alice/repo1.git"
E, finalmente, você foi à Settings > Deploy keys
seção de repositório e adicionou o conteúdo dealice_github.id_rsa.pub
Neste ponto, você pode fazer o seu git pull origin master
sem inserir uma senha sem problemas.
mas e o segundo repositório?
Portanto, seu instinto será pegar a chave e adicioná-la às repo2
chaves 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 repo2
configuraçã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.com
domínio?
Seu .ssh/config
arquivo aponta github.com
e 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.com
erepo2.github.com
Então, a primeira coisa é editar os .git/config
arquivos 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/config
arquivo, 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 master
sem 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.