Existem certas situações em que é necessário fazer commits com diferentes contas, como, por exemplo: múltiplas chaves SSH por cada host de Git, usar o mesmo computador para trabalho e projetos pessoais, ou até ajudar alguém que não se queira que se saiba que o commit foi feito por outra pessoa 😜.
No meu caso, eu uso 1Password como o meu password manager. Como o me password manager permite gerir as minhas keys SSH e oferece um agent de SSH, posso configura o nosso servidor de SSH para fazer uso deste agente. Desta forma a configuração do meu SSH (~/.ssh/config
) parecesse com algo como:
Host *
IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"
Estou a usar macOS para este artigo, mas o mesmo pode ser feito em qualquer outro sistema.
Agora que sabemos o estado por defeito do nosso sistema, vamos assumir que temos duas contas de Git, uma para trabalho e outra para projetos pessoais.
1. Criar a nova key para trabalho
Assumindo que já tenho a minha key para projetos pessoais e que esta é fornecida pelo meu 1Password, apenas tenho que gerar uma nova key para o meu trabalho. Para gerar a nova key podemos executar o comando:
ssh-keygen -t ed25519 -C "[email protected]"
Quando for pedido para especificar o caminho onde a chave será gravada teremos que assegurar que não destruimos nenhuma chave já existente. No meu carro o diretório está vazio uma vez que as minhas chaves não deixam o 1Password. Mesmo assim, vou guardar a chave com um nome mais sugestivo que iremos usar daqui em diante, id_work
.
O próximo passo é adicionar a nova chave SSH à nossa conta, no host que a empresa está a usar. No meu caso é GitHub, então apenas tenho que seguir este artigo.
2. Configurar SSH para usar a nova chave
Como eu uso o GitHub pessoalmente, não posso simplesmente deixar o servidor de SSH decidir a chave a usar. Sem nenhuma alteração iria fazer uso da minha chave pessoal. Para resolver isto vamos adicionar um novo host no ficheiro ~/.ssh/config
:
# work configuration
Host github.com-work
Hostname github.com
User git
IdentifyFile ~/.ssh/id_work
IdentitiesOnly yes
Como podem notar o host é algo que não existe, podemos olhar para isto como um alias, e o verdadeiro domínio é especificado em Hostname
.
3. Configurar a Identidade do Git
O nosso próximo objetivo é fazer o clone de um dos repositórios do meu trabalho, mas teremos que substituir o github.com
ou github.com-work
- como anteriormente configurado.
git clone [email protected]/my-work/my-project.git work-project && cd work-project
Com o clone feito, falta-nos configurar um novo utilizador. Para isso, executamos git config --local -e
e adicionamos:
[user]
name = Gil Mendes
email = [email protected]
Desta forma configuramos o utilizador que vai ser usado no repositório. O último passo é assegurar que o remote está com a informação correta. Para isso corremos o seguinte comando:
git remote set-url origin [email protected]:my-work/my-project.git
O mesmo pode ser conseguida modificando a config do Git local, como anteriormente (git config --local -e
):
[remote "origin"]
url = [email protected]:my-work/my-project.git
fetch = +refs/heads/*:refs/remotes/origin/*
4. Conclusão
Com isto, todas as ações que faça de agora em diante iram usar o utilizador e a chave SSH que criamos. Usando esta técnica podemos ter duas ou mais chaves diferentes em uso simultaneamente.