Artigo original: https://www.freecodecamp.org/news/manage-multiple-github-accounts-the-ssh-way-2dadc30ccaca/

A necessidade de gerenciar várias contas do GitHub na mesma máquina surge em algum momento para a maioria dos desenvolvedores. Sempre que eu tenho de trocar de computador ou quando preciso fazer um Git push com uma nova conta de trabalho, acabo tendo de navegar por todos os guias disponíveis on-line sobre algo que eu já fiz uma dezena de vezes.

Minha preguiça de não documentar o processo e minha incapacidade de lembrar do passo a passo me faz passar um bom tempo juntando as partes por toda a web e fazendo funcionar de algum modo.

Tenho certeza de que muitos de vocês já passaram por isso e que muitos mais estão somente esperando a próxima vez em que isso vai acontecer (eu mesmo incluído). Este artigo serve para ajudar a nós todos.

1. Geração das chaves SSH

Antes de gerar uma chave SSH, podemos verificar se temos chaves SSH existentes: ls -al ~/.ssh Esse comando listará todos os pares de chaves públicas e privadas, se eles existirem.

Se ~/.ssh/id_rsa estiver disponível, podemos reutilizá-lo. Do contrário, podemos gerar primeiro uma chave com o padrão ~/.ssh/id_rsa executando o seguinte comando:

ssh-keygen -t rsa

Ao sermos perguntados em que local devemos salvar as chaves, aceite o local padrão pressionando Enter. Uma chave privada e uma chave pública ~/.ssh/id_rsa.pub serão criadas no local padrão de ssh ~/.ssh/.

Vamos usar esse par de chaves padrão para nossa conta pessoal.

Para as contas de trabalho, criaremos chaves SSH diferentes. O código abaixo gerará as chaves SSH, salvando a chave pública com a tag "email@work_mail.com" em ~/.ssh/id_rsa_work_user1.pub

$ ssh-keygen -t rsa -C "email@work_mail.com" -f "id_rsa_work_user1"

Temos duas chaves diferentes criadas:

~/.ssh/id_rsa
~/.ssh/id_rsa_work_user1

2. Inclusão da nova chave SSH na conta do GitHub correspondente

Já temos prontas as chaves públicas SSH. Pediremos agora às nossas contas do GitHub para que confiem nas chaves que criamos. Isto serve para nos livrarmos da necessidade de digitar o nome de usuário e a senha cada vez que fizermos um Git push.

Copie a chave pública pbcopy < ~/.ssh/id_rsa.pub e entre em sua conta pessoal do GitHub:

  1. Vá até Settings
  2. Selecione SSH and GPG keys no menu à esquerda.
  3. Clique em New SSH key, dê a ela um título adequado, e cole a chave na caixa que aparece
  4. Clique em Add key — e pronto!
Para as contas de trabalho, use as chaves públicas correspondentes (pbcopy < ~/.ssh/id_rsa_work_user1.pub) e repita os passos acima nas contas de trabalho do GitHub.

3 . Registro das novas chaves SSH com o ssh-agent

Para usar as chaves, precisamos registrá-las com o ssh-agent em nossa máquina. Certifique-se de que o ssh-agent está em execução usando o comando eval "$(ssh-agent -s)".
Adicione as chaves ao ssh-agent assim:

ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_work_user1

Faça com que o ssh-agent use as chaves SSH respectivas para os diferentes Hosts de SSH.

Esta é a parte crucial. Para ela, temos duas abordagens diferentes:

Usar o arquivo de configuração de SSH (Passo 4), e manter apenas uma chave SSH ativa no ssh-agent por vez (Passo 5).

4. Criar o arquivo de configuração de SSH

Aqui, estamos de fato adicionando regras de configuração de SSH para hosts diferentes, declarando que arquivo de identidade usar para cada domínio.

O arquivo de configuração de SSH estará disponível em ~/.ssh/config. Edite-o, se ele existir, ou crie-o, do contrário.

$ cd ~/.ssh/
$ touch config           // Cria o arquivo se ele não existir
$ code config            // Abre o arquivo no VS code, mas você pode usar qualquer editor

Faça as entradas de configuração para as contas relevantes do GitHub de maneira semelhante a que vemos abaixo em seu arquivo ~/.ssh/config:

# Conta pessoal, a configuração padrão
Host github.com
   HostName github.com
   User git
   IdentityFile ~/.ssh/id_rsa
   
# Conta de trabalho-1
Host github.com-work_user1    
   HostName github.com
   User git
   IdentityFile ~/.ssh/id_rsa_work_user1

"work_user1" é o id de usuário do GitHub para a conta de trabalho.

"github.com-work_user1" é uma notação usada para diferenciar as várias contas do Git. Você também pode usar a notação "work_user1.github.com". Lembre-se de ser consistente com a notação de nome de host que você usa. Isso é relevante ao clonar um repositório ou quando você define remote origin para um repositório local

A configuração acima pede ao ssh-agent para:

  • Usar id_rsa como a chave para todo URL do Git que use @github.com
  • Usar a chave id_rsa_work_user1 para qualquer URL do Git que use @github.com-work_user1

5. Uma chave SSH ativa no ssh-agent por vez

Esta abordagem não exige regras de configuração de SSH. Em vez disso, garantimos manualmente que o ssh-agent tenha apenas a chave relevante associada no momento de qualquer operação do Git.

ssh-add -l listará todas as chaves SSH associadas ao ssh-agent. Remova todas elas e adicione aquela que você usará.

Se for a da sua conta pessoal do Git:

$ ssh-add -D            //remove todas as entradas de ssh do ssh-agent
$ ssh-add ~/.ssh/id_rsa                 // Adiciona a chave ssh relevante

O ssh-agent agora tem a chave mapeada com a conta pessoal do GitHub. Podemos fazer um Git push para o repositório pessoal.

Para fazer o push para a conta de trabalho do GitHub, work-user1, mude a chave SSH mapeada com o ssh-agent removendo a chave existente e adicionando a chave SSH mapeada com a conta de trabalho do GitHub.

$ ssh-add -D
$ ssh-add ~/.ssh/id_rsa_work_user1

O ssh-agent agora tem a chave mapeada com a conta de trabalho do Github e você pode fazer um Git push para o repositório de trabalho. Isso, no entanto, exige um pouco de esforço manual.

Configuração do URL remoto do git para os repositórios locais

Ao termos o repositório local do Git clonado/criado, confira se o nome de usuário e o e-mail da configuração do Git são exatamente aqueles que você quer. O GitHub identifica o autor dos commits a partir do id de e-mail associado à descrição do commit.

Para listar o nome e o e-mail da configuração no diretório local do Git, digite os comando git config user.name e git config user.email. Se não forem encontrados, atualize-os de acordo.

git config user.name "User 1"   // Atualiza o nome de usuário do git config
git config user.email "user1@workMail.com"

6. Durante a clonagem dos repositórios

Observação: o passo 7 ajudará se tivermos o repositório já disponível no local.

Agora que as configurações estão prontas, podemos seguir em frente e clonar os repositórios correspondentes. Durante a clonagem, tome nota do que usarmos como nome de host e que usamos na configuração do SSH.

Os repositórios podem ser clonados usando o comando Git clone, fornecido pelo Git:

git clone git@github.com:personal_account_name/repo_name.git

O repositório de trabalho exigirá que se faça uma mudança com este comando:

git clone git@github.com-work_user1:work_user1/repo_name.git

Essa alteração é feita dependendo do nome do host definido na configuração do SSH. A string entre @ e : deve corresponder ao que fornecemos no arquivo de configuração do SSH.

7. Para repositórios locais existentes

Se já tivermos clonado o repositório:

Liste o Git remote do repositório, git remote -v

Verifique se o URL corresponde ao nosso host do GitHub a ser usado, ou atualize o URL de remote origin.

git remote set-url origin git@github.com-worker_user1:worker_user1/repo_name.git

Certifique de que a string entre @ e : corresponde ao Host que fornecemos na nossa configuração do SSH.

Se estiver criando um novo repositório no local:

Inicialize o Git na pasta git init do projeto.

Crie o novo repositório na conta do GitHub e adicione-o como o Git remote ao repositório local.

git remote add origin git@github.com-work_user1:work_user1/repo_name.git 

Certifique de que a string entre @ e : corresponde ao Host que fornecemos na nossa configuração do SSH.

Faça o push do commit inicial para o repositório do GitHub:

git add .
git commit -m "Initial commit"
git push -u origin master

Estamos prontos!

Adicionar ou atualizar o Git remote do diretório local do Git com o host adequado resolverá a seleção da chave de SSH correta para verificar nossa identidade com o GitHub. Quando tudo que vimos acima estiver pronto, nossas git operations funcionarão sem problemas.