Como configurar duas contas do GitHub no seu computador utilizando chaves SSH
Tags: braziliandevs, github, git, beginners
Published: 2023-08-10 12:42:29

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:** <u>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</u>.

> **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](https://git-scm.com/downloads) 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! <u>Não quero reinventar a roda</u>.

___

## 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 <b>.ssh</b> (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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5pevlyfswlx1jk99x5f.png)

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

```bash
ssh-keygen -t ed25519 -C "seu_email@provedor.com" -f nome_da_chave
```
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.

```bash
Enter passphrase (empty for no passphrase):
```

E depois:

```bash
Enter same passphrase again:
```

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:

```bash
eval "$(ssh-agent -s)"
```

E depois adicionar sua chave:

```bash
ssh-add ~/.ssh/nome_da_chave
```

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):

```bash
clip <~/.ssh/nome_da_chave.pub
```

Para outros OS, veja [aqui](https://medium.com/@timleland/copy-ssh-key-to-clipboard-183dbf6d2a39) 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:

```bash
touch config
```

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
```

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
```

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:

```bash
git config --list
```

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
```

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
```

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
```

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](https://stackoverflow.com/questions/69988240/includeif-is-not-working-on-git-for-windows).

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
```

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:

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

```

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