Se você tem conta pessoal e de trabalho no Git (ou até freelas), já deve ter sofrido com o SSH misturando as chaves.
A boa notícia é que dá pra resolver de dois jeitos: automático por diretório ou via alias de host.
Automático por diretório (requer OpenSSH 7.3+)
Essa é a forma que eu mais gosto. Só de estar dentro da pasta do projeto, o SSH já sabe qual chave usar.
Mas atenção: funciona apenas no OpenSSH 7.3 ou superior e você precisa separar os projetos por pastas (pessoais em uma e profissionais em outra, por exemplo). Verifique sua versão do SSH com:
ssh -V
Agora vamos a estrutura de pastas, essa parte é fundamental, precisamos de uma pasta para cada chave, atualmente eu uso algo como:
projects/ #vai usar a chave pessoal
- blog
- estudos
- urubu_do_pix
- work/ # daqui pra frente vai usar a chave do trabalho
- projectA
- projectB
Ou seja, tudo do trabalho fica na pasta ‘work’. Vamos fazer com que o SSH use uma chave pra todos os lugares e troque apenas quando estiver na ‘work’.
Edite o arquivo de configuração no do SSH que fica em ~/.ssh/config
:
# Configuração padrão, usa a chave pessoal
Host github.com
AddKeysToAgent yes
User git
# UseKeychain yes # (se estiver no macOS)
IdentitiesOnly yes
# Chave para projetos do trabalho
Match exec "[[ $PWD == /home/tulio/projects/work* ]]"
IdentityFile ~/.ssh/work_key
Match all
IdentityFile ~/.ssh/my_key
Lembre de trocar os caminhos, tanto das chaves quanto da pasta work.
Com isso, se você fizer um clone, push ou pull em qualquer lugar diferente da pasta ‘work’, ele vai usar a chave pessoal. Na pasta ‘work’, usa a chave do trabalho. Simples assim.
Alternativa: usando aliases de host
Se a sua versão do SSH não suporta Match exec, dá pra resolver usando aliases.
Nesse caso você cria “atalhos” e aponta o git remote para eles.
Edite o ~/.ssh/config
:
# Conta pessoal
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/my_key
# Conta do trabalho
Host work.github.com
HostName github.com
User git
IdentityFile ~/.ssh/work_key
Aqui você pode ser criativo com o alias, pode usar até algo mais curto, como "w" apenas, sem o github.com, basta lembrar que na hora de clonar você terá que colonar com "w" no lugar do "github.com" (git@w:org/project.git)
E na hora do clone basta você adicionar work
antes do github
, exemplo:
git clone git@work.github.com:...
Caso ja tenha o projeto clonado basta trocar a URL da origin, você pode fazer assim:
Veja a URL atual do repositorio:
git remote -v
Copie a URL e adicione o work
na frente e troque com:
git remote set-url origin git@work.github.com:...
Fechando
Hoje eu uso o esquema automático por diretório porque me poupa tempo e evita erro, mas a versão com alias funciona em qualquer lugar e é à prova de falhas.
De qualquer jeito, o resultado é o mesmo: nunca mais push falhando por causa da chave errada.
Você pode repetir a configuração para usar várias chaves, eu utilizei apenas duas para simplificar.
Top comments (0)