Como usar mais de uma conta no GitHub no mesmo sistema, usando chaves SSH [Ubuntu]
- #Linux
- #GitHub
- #Git
Normalmente, temos uma máquina para trabalhar e uma para usar nos momentos em que não se trabalha. E enquanto as duas estão ok, seguimos suave na nave... Mas e quando dá ruim na sua máquina pessoal e não dá para consertar em tempo hábil, como que a gente faz para continuar? Dá pra usar meu perfil pessoal do github sem misturar com o de trabalho?
Spoiler: dá. Só seguir lendo
Configurando diferentes emails
Quando o Git vai assinar um commit ele primeiro procura as informações dentro da pasta `.git` dentro do projeto e caso não tenha nada definido localmente, ele procura pela configuração global que fica num arquivo chamado `.gitconfig` na pasta raiz do usuário.
E é aqui que iremos fazer uma jogada para o Git ler o que nós queremos que ele leia. Eu costumo ter uma estrutura de pastas da seguinte forma:
~/Documentos/Pessoal/java # meus projetos pessoais
~/Documentos/GitHub # projetos de trabalho
Como é um padrão bem simples, fica fácil de falar para o Git o seguinte:
- Se estiver na pasta java use meu email pessoal
- Se estiver na pasta GitHub use meu email de trabalho
E aí para definir isso, crie 2 arquivos na sua home (~):
.gitconfig-github
.gitconfig-trabalho
E os conteúdos ficam:
# .gitconfig-github
[user]
email = andresoaresnascimento@pessoal.com.br
E no outro:
# .gitconfig-trabalho
[user]
email = andresoaresnascimento@trabalho.com.br
Lembrando que aqui estou mostrando só o email, mas outras configurações como aliases específicos para cada conta e qualquer outra coisa, você consegue separar tranquilamente nesses arquivos.
Mas só fazendo isso, ainda não vai funcionar, nós precisamos informar ao Git quando é parar ler um ou outro, para isso nós editaremos o .gitconfig original para ficar assim:
[user]
name = Andre S Nascimento
[init]
defaultBranch = main
[includeIf "gitdir:~/Documentos/Pessoal/java/"]
path = .gitconfig-github
[includeIf "gitdir:~/Documentos/GitHub/"]
path = .gitconfig-trabalho
Note que eu tenho coisas globais ainda, como meu nome e o branch inicial quando criar. Mas utilizo um includeIf exatamente para quando cair numa opção ou outra, ele adicionar meus dados específicos.
Configurando duas chaves SSH
Agora vamos a segunda parte que é ainda mais importante, afinal de contas, se as chaves não estiverem bem configuradas, você não consegue nem fazer push para o repositório.
Primeiro de tudo, você precisa criar chaves SSH separadas, até para facilitar nessa separação, para isso, é só rodar:
ssh-keygen -t rsa -C "email@pessoal.com.br" -f "id_rsa_pessoal"
ssh-keygen -t rsa -C "email@trabalho.com.br" -f "id_rsa_trabalho"
Ao fazer isso, ele vai criar duas chaves separadas na pasta ~/.ssh, depois basta adicionar na sua máquina usando:
ssh-add ~/.ssh/id_rsa_pessoal
ssh-add ~/.ssh/id_rsa_trabalho
Depois disso precisamos configurar o ssh para também entender quando usar uma chave ou outra. Para isso vamos criar um arquivo `config` dentro da pasta .ssh:
cd ~/.ssh
touch config
code config # você pode usar vi, vim, nano, enfim, editor favorito
Lá dentro do arquivo é só inserir:
# Conta do trabalho
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_trabalho
# Conta pessoal
Host github.com-pessoal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_pessoal
Ali está como `github`, mas para o `gitlab` é só mudar no `Host` e `Hostname`, você inclusive pode ter diferentes configs de diferentes repositórios remotos no mesmo arquivo.
E aí, sempre que for clonar um repositório, se ele for o pessoal, basta estar na sua pasta de projetos pessoais e editar na url copiada do GitHub para ficar de acordo com o que definimos na estrutura do arquivo config acima:
git clone git@github.com-pessoal:seu_user/repo_name.git
Prontinho, agora sua máquina está configurada para trabalhar com duas contas do Git e assim você não fica misturando usuários e chaves entre coisas pessoais e empresa!
E fazendo o clone pelo terminal, depois a IDE faz todo o processo correto de commit e push.
(baseado no artigo original: https://www.freecodecamp.org/news/manage-multiple-github-accounts-the-ssh-way-2dadc30ccaca/)