Já precisou utilizar duas ou mais contas no Git CLI e recebeu de autenticação devido a conflito de credencial? Isso ocorre, geralmente, quando usamos a mesma chave de autenticação em duas contas diferentes no Github/Gitlab. A seguir veremos como configurar duas ou mais contas diferentes no mesmo computador para utilizar no Git via command line.
Requisito
Os métodos que descrevo só funcionam para repositórios clonados por SSH, pois consiste em separar as diferentes credenciais por meio de chaves de autenticação distintas. Repositórios clonados por HTTPS utilizam Tokens, e não chaves.
Cenário
Ao rodar git pull, você recebe uma mensagem similar a esta:
ERROR: Permission to usuario/repo.git denied to usuario-errado. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
Como dito anteriormente, isso acontece quando uma mesma chave (RSA ou ECC) está configurada em duas contas distintas no Github ou Gitlab.
Como criar as chaves RSA ou ECC
Se você já possui as chaves necessárias e queira ver somente os métodos de resolver o problema, pule para Método 1 – Config direto em cada repo local
Caso esteja configurando tudo do zero e tenha dúvidas sobre como criar os pares de chaves, podemos criá-las com os comandos a seguir. Lembrando que precisamos de 1 par de chaves por repo. Como, nesses exemplos, temos 2 repositórios Git, então vamos criar dois pares de chaves.
Você deve criar chaves ECC ou RSA. Não deve criar ambas.
Criando chaves ECC
Criando o primeiro par de chaves para uma das contas:
Antes de executar os comandos a seguir, lembre-se de fazer as devidas substituições alterando “conta1” e “conta2”, além de id_git_conta1 e id_git_conta2.
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_git_conta1
Agora, criando o segundo par de chaves para a outra conta:
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_git_conta2
Criando chaves RSA
Se preferir criar RSA, o comando é esse:
ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/id_git_conta1
ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/id_git_conta2
Dois pares de chaves foram criadas no diretório ~/.ssh. Os arquivos com extensão “.pub” são as chaves públicas e devem ser configuradas na sua conta do Github/Gitlab.
Agora que temos as chaves, podemos seguir com os métodos. São 3 formas diferentes de resolver o problema. Escolha o que melhor te atender.
Método 1 – Config direto em cada repo local
Esse é o método mais simples, mas, dependendo do cenário, a longo prazo, pode ser o mais difícil de gerenciar. Consiste em editar a configuração do repositório local já clonado.
Basta entrar no diretório de cada git repo e executar:
git config core.sshCommand "ssh -i ~/.ssh/chave_privada_da_conta"
Ponto positivo: É persistente, ou seja, não vai dar problemas assim, do nada. O ponto negativo é que o comando é difícil de memorizar, e você vai precisar dele no futuro caso comece a utilizar uma nova conta Github/Gitlab.
Método 2 – Em tempo de execução
Outra forma de contornar o problema é declarando a variável GIT_SSH_COMMAND sempre que for rodar o git push.
GIT_SSH_COMMAND="ssh -i ~/.ssh/chave_privada_da_conta" git clone [email protected]:usuario/repo.git
O problema disso é que essa chave só será utilizada enquanto a sessão do terminal for válida. Quando fechar o terminal, o valor definido na variável GIT_SSH_COMMAND será perdido.
Método 3 – SSH Config File.
Podemos mapear, de forma persistente, as chaves dos repos via SSH Config File local do usuário do sistema.
Para isso é preciso criar ou editar o arquivo ~/.ssh/config adicionando o seguinte conteúdo:
# Conta principal Host github.com.conta1 HostName github.com User git IdentityFile ~/.ssh/id_git_conta1 # Segunda conta Host github.com.conta2 HostName github.com User git IdentityFile ~/.ssh/id_git_conta2
A diretiva “Host” cria um domain alias para o domínio declarado na diretiva “HostName“. Vamos configurar esses aliases em cada git repo e, quando chamarmos esse Host via comando git, serão utilizadas as credenciais definidas nas diretivas “User” e “IdentityFile“.
Uma vez configurado, para testar, execute o comando abaixo:
ssh -T [email protected]
ssh -T [email protected]
O que faremos a seguir é, basicamente, alterar o Host do repositório Git para os alises que criamos. Com isso, a autenticação será feita com o “User” e “IdentityFile” vinculados ao Host do ~/.ssh/config.
Configurando domain alias em repositório já clonado:
Caso o clone do repositório já esteja na sua máquina, basta editar o domínio do repositório com o comando a seguir:
git remote set-url origin [email protected]:usuario-conta1/repo.git
git remote set-url origin [email protected]:usuario-conta2/repo.git
Clonando repositório do zero com domain alias:
Caso o clone ainda não tenha sido feito, pode-se fazer já utilizando o domain alias como no exemplo abaixo:
git clone [email protected]:usuario-conta1/repo.git
git clone [email protected]:usuario-conta2/repo.git
Para confirmar:
git remote -v
Agora basta testar a vontade.
Resumo
São muitos os casos em que precisamos utilizar diferentes credenciais em repositórios git diferentes. Seja porque temos vários clientes, seja porque os ambientes estão separados em repos diferentes. Fato é que isso é fácil de resolver. A forma mais adequada é a que melhor lhe atende a longo prazo.
Abraços e até a próxima.

