DEV Community

Felipe Mendes
Felipe Mendes

Posted on • Updated on

Como configurar duas contas do GitHub no seu computador utilizando chaves SSH

Se você chegou até aqui, é provável que tenha se deparado com um problema muito comum para vários devs: o de precisar utilizar duas contas do GitHub na mesma máquina utilizando chaves SSH.

Geralmente essa demanda surge quando temos uma conta pessoal e uma conta vinculada à empresa em que trabalhamos na plataforma, então ATENÇÃO: só faça se a sua empresa autorizar ter sua conta pessoal na máquina deles ou se eles autorizarem você a ter o projeto deles em sua máquina pessoal.

Nota 1: Vou partir do pressuposto de que você possui uma conta principal (por exemplo, sua conta pessoal) e já utiliza a chave SSH no dia-a-dia e deseja de vez em quando utilizar outra conta em um diretório separado, sem misturar as coisas. Se você deseja utilizar dessa forma, aqui é o lugar certo.

Obs: imagino também que já tenha o Git instalado, se não, baixe aqui e só depois prossiga com o tutorial.

Nota 2: Existem outros tutoriais disponíveis, sobretudo em inglês e voltados para Linux. Portanto vou abordar o Windows e comentar sobre um problema nesse OS e como uma resposta no Stack Overflow me ajudou a resolver. No fim das contas é um condensado de informações já disponíveis que espero que te ajude! Não quero reinventar a roda.


Passo 1: Criar um novo par de chaves SSH

Sempre utilizo a expressão par de chaves, pois ao gerar uma nova chave temos a versão pública e a versão privada dessa chave.

Para criar um novo par de chaves SSH, vá até a pasta .ssh (no Windows ela fica em C:\Users\seu_usuario\.ssh) e dentro dela abra um novo terminal Git Bash:

Imagem com o menu do Windows para abrir uma nova janela do Git Bash

Como terminal aberto, você rodará o seguinte comando:

ssh-keygen -t ed25519 -C "seu_email@provedor.com" -f nome_da_chave
Enter fullscreen mode Exit fullscreen mode

Substitua seu_email@provedor.com pelo seu e-mail e nome_da_chave pelo o nome que você prefira para identificar a chave.

Lembra que eu comentei que parto do pressuposto de que você já possui um par de chaves cadastrada em sua máquina? Sem a parte final do comando que citei acima, ele geraria um par de chaves com o nome de id_ed25519 e substituiria as suas chaves originais caso você tenha gerado sem um nome personalizado da primeira vez. Portanto o -f nome_da_chave é importante nesse contexto para garantir uma identificação diferente e não apagar suas chaves iniciais.

Ao rodar o comando, será solicitado que você digite uma senha para sua chave SSH e depois confirmá-la. Caso opte por não incluir uma senha, apenas prossiga sem digitar nada e aperte Enter nas duas oportunidades.

Enter passphrase (empty for no passphrase):
Enter fullscreen mode Exit fullscreen mode

E depois:

Enter same passphrase again:
Enter fullscreen mode Exit fullscreen mode

Se você gerou uma senha para seu par de chaves, convém adicioná-las ao ssh-agent. Ele vai gerenciar sua senha e deixar suas chaves prontas para uso sem que você precise ficar digitando sempre a sua senha. Se não colocou senha, apenas ignore esse passo.

Para colocar suas chaves no ssh-agente, primeiro você tem que iniciá-lo com o seguinte comando:

eval "$(ssh-agent -s)"
Enter fullscreen mode Exit fullscreen mode

E depois adicionar sua chave:

ssh-add ~/.ssh/nome_da_chave
Enter fullscreen mode Exit fullscreen mode

Substitua nome_da_chave pela identificação da chave que você criou anteriormente.

No meu caso, eu não criei uma senha, pois fiz no meu computador pessoal, então não adicionei ao ssh-agent, mas é aquela conversa: o seguro morreu de velho.


Passo 2: Adicione a chave pública ao GitHub

Você pode copiar a chave pública de duas maneiras:

  • Abrindo a chave com o final .pub em algum editor de texto e copiando todo o conteúdo com um simples Ctrl+C; ou
  • Redigindo o seguinte comando (se estiver usando Windows e o Git Bash):
clip <~/.ssh/nome_da_chave.pub
Enter fullscreen mode Exit fullscreen mode

Para outros OS, veja aqui como copiar a chave via terminal.

Com a chave copiada, vá até o seu perfil no GitHub, entre nas configurações e depois em SSH and GPG Keys. Agora clique em Add new SSH Key e cole sua chave pública no campo Key. Se quiser, pode dar um nome para identificar a chave em Title. Depois disso é só confirmar e sua chave já está pronta para uso!


Passo 3: Configurar corretamente os perfis em sua máquina

Dentro da pasta .ssh deve existir um arquivo chamado config. Caso ele não exista, você pode criá-lo. Com o Git Bash aberto na pasta .ssh, digite o seguinte comando:

touch config
Enter fullscreen mode Exit fullscreen mode

E para editar o arquivo, abra o em um editor de texto ou use um editor diretamente no terminal.

Esse arquivo é o que fará o elo entre as suas chaves e o comando que você faz ao clonar um repositório em sua máquina. Ao visualizar o que há dentro do arquivo config, ele deve possuir os seguintes itens:

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/nome_da_chave
Enter fullscreen mode Exit fullscreen mode

Porém como estamos falando de duas contas na mesma máquina, ele deverá possuir duas configurações diferentes. Para fazer isso, você precisa compreender os termos que estão ali no arquivo.

  • Host: aqui você define para qual Host ou Hosts a configuração vai se aplicar. Em outras palavras: você tá criando uma identificação para determinado Host;
  • HostName: especifica o nome real do Host, o endereço ao qual você irá se conectar;
  • IdentityFile: especifica qual arquivo deverá ser lido ao se conectar ao Host.

Dito isto, vamos especificar apenas Host e IdentityFile, enquanto para HostName usaremos sempre github.com, já que é lá que estão os repositórios.

Se você já tinha chaves SSH e utilizava GitHub normalmente em sua máquina, sugiro que o seu Host dessa primeira chave continue como github.com. Caso seja alterado, você precisará atualizar a origin de todos os repositórios já clonados anteriormente.

Sendo assim, o seu arquivo deve ficar assim:

# sua primeira chave
Host github.com
    HostName github.com
    IdentityFile ~/.ssh/id_ed25519

# chave que você criou seguindo esse artigo
Host github.com-trabalho
    HostName github.com
    IdentityFile ~/.ssh/nome_da_chave
Enter fullscreen mode Exit fullscreen mode

Percebam que para o segundo Host, o que fiz foi adicionar -trabalho após github.com na primeira linha e alterei o caminho para a nova chave criada.

Seja livre para alterar da maneira que achar necessário. Você pode incluir o nome que quiser ali.


A primeira parte está concluída, e agora vamos configurar o nosso arquivo .gitconfig. É nele que estão as configurações globais da nossa conta. Se tiver dúvidas de como seu Git está configurado, com o terminal aberto, digite o seguinte comando:

git config --list
Enter fullscreen mode Exit fullscreen mode

Ele deverá retornar uma lista com algumas configurações, e as que importam para nós agora são user.email e user.name.

user.name=Seu Nome
user.email=seu_email@provedor.com
Enter fullscreen mode Exit fullscreen mode

Se ele retornar pelo menos o user.email, significa que essa é a conta que está cadastrada globalmente em sua máquina. O que vamos fazer agora é criar uma verificação para esses dados. Basicamente ele vai funcionar assim:

  • Se você clonar qualquer repositório em sua máquina, ele vai pegar as configurações globais;
  • Porém se você clonar um repositório dentro de um diretório/pasta específico, ele irá utilizar as configurações da sua segunda conta e sua segunda chave SSH.

O arquivo .gitconfig fica no seguinte endereço: C:\Users\seu_usuario\.gitconfig. Abra-o em algum editor de texto. Ele deverá se parecido com esse:

[user]
    email = seu_email@provedor.com 
    name = Seu Nome
Enter fullscreen mode Exit fullscreen mode

O que faremos agora é criar uma verificar utilizando o includeIf, que nada mais é do que um inclua isso SE... . Dessa forma, vamos criar a seguinte regra: se for dentro da pasta tal, leia esse .gitconfig.

Portanto seu arquivo deverá ficar assim:

[user]
    email = seu_email@provedor.com 
    name = Seu Nome

[includeIf "gitdir/i:C:/nome_da_pasta/"]
    path = C:/nome_da_pasta/.gitconfig
Enter fullscreen mode Exit fullscreen mode

Repararam que inclui um /i antes de :C:? Pois bem, ao incluir o /i, você está garantindo que ao ler a rota, sua regra será case insensitive, em outras palavras: ela vai ignorar se o texto está em caixa alta ou não. Como no Windows o padrão é que os drives contenham letras maiúsculas, você garante que o script conseguirá ser lido. Consegui resolver isso com ajuda do bom e velho Stack Overflow.

Pois bem, agora o ajuste final: Você deverá criar a pasta em que guardará todos os repositórios que serão clonados com seu novo par de chaves SSH. Se repararem bem, no meu caso eu criei a pasta diretamente no drive C, mas você pode fazer como bem entender.


Para finalizar, crie um arquivo .gitconfig dentro dessa pasta, e dentro dele coloque as configurações da sua segunda conta do GitHub. O arquivo deve ficar assim:

[user]
    email = seu_email@provedor.com
    name = Seu Nome
Enter fullscreen mode Exit fullscreen mode

Isso garantirá que seus commits estejam sempre vinculados à conta correta.


Passo 4: clone um repositório

Para clonar um repositório, vamos relembrar o Host citado mais atrás. Lembre-se dele ao clonar os repositórios para sua máquina.

Entre na pasta que você criou o arquivo .gitconfig, abra o Git Bash e clone um repositório fazendo o seguinte: adicione o nome que você criou para seu Host logo após a @ e antes dos dois ponts :, como no exemplo abaixo:

git clone git@{seu-novo-host}:{usuario}/{repositorio}.git

Enter fullscreen mode Exit fullscreen mode

Substitua seu-novo-host pelo Host criado no passo 3. Lembre-se sempre de fazer essa pequena alteração ao clonar os repositórios para essa pasta específica. E pronto! A partir de agora você não terá nenhum tipo de problema com ao criar um novo commit e um novo push.


Conclusão

Como já citei anteriormente, sei que existem outros tutoriais, sobretudo em inglês, que abordam a mesma questão. Mas optei por trazer uma versão em português mais longa tentando abordar o funcionamento de cada passo e espero que isso ajude outras pessoas a entenderem melhor o funcionamento do Git e suas pequenas particularidades.

Espero que tenha resolvido seu problema. Me conte nos comentários!


Referências

  1. https://stackoverflow.com/questions/69988240/includeif-is-not-working-on-git-for-windows
  2. https://medium.com/@pinglinh/how-to-have-2-github-accounts-on-one-machine-windows-69b5b4c5b14e
  3. https://gist.github.com/rahularity/86da20fe3858e6b311de068201d279e3
  4. https://dev.to/fabriciadiniz/como-utilizar-duas-contas-do-github-no-mesmo-computador-windows-2348
  5. https://dev.to/devgirls/guia-gerenciando-2-ssh-keys-do-github-no-seu-pc-apm
  6. https://dev.to/giovanisleite/como-configurar-chaves-ssh-para-duas-ou-mais-contas-no-github-5de9
  7. https://medium.com/@timleland/copy-ssh-key-to-clipboard-183dbf6d2a39
  8. https://www.cyberciti.biz/faq/create-ssh-config-file-on-linux-unix/
  9. https://dev.to/dxwebster/como-conectar-ao-github-com-chaves-ssh-1i41

Top comments (39)

Collapse
 
danielhe4rt profile image
Daniel Reis

Foda pacaraio primo, continue com a produção de conteúdo!

Collapse
 
jvictorv profile image
João Victor

Forte demais, nunca mais vou commitar com a conta errada!

Collapse
 
robsongrangeiro profile image
Robson Grangeiro

Muito bom, ótimas dicas, valeu!

Collapse
 
luiscarlosb3 profile image
Luis Carlos Galvão de Oliveira

Conteúdo ficou muito massa

Collapse
 
renataalbq profile image
Renata Albuquerque

muito foda primo!

Collapse
 
renancferro profile image
Renan Ferro

Booa, bom artigo man!!!

Collapse
 
viniciusenari profile image
Vinicius Koji Enari

Valeu por trazer esse conteúdo em português. Vai ajudar muita gente!

Collapse
 
alvesjessica profile image
Jessica Alves

Muito legal o post! 👏🏼 Parabéns!

Collapse
 
evertooont profile image
Everton Reis

Muito bom!!

Collapse
 
aquiladvx profile image
Davi Áquila

Mt obg mano, tava precisando disso

Collapse
 
fernandoandrade profile image
Fernando Andrade

conteúdo muito bom

Collapse
 
leodiegoo profile image
Leonardo Diego

Boa!! Continue assim, primo!

Collapse
 
tiotoninho profile image
Antonio Vinicius

Brabo demais o conteúdo!

Collapse
 
renato_zero6 profile image
Renato Rebouças

top de mais

Collapse
 
themegazord profile image
Gustavo de Camargo Campos

Tu é pica meu parceiro, continue assim