Fala povo, recentemente eu voltei ao mercado de trabalho para trabalhar numa startup chamada Zapt e consequentemente precisei configurar o Git da minha máquina para não usar somente o meu email pessoal, mas também o da empresa, principalmente porque lá utilizam o GitLab ao invés do GitHub, então ele é mais chatinho para reconhecer os emails e chaves SSH.
É bem simples de configurar, mas percebi que muita gente não sabe como fazer da mesma maneira que eu faço, então resolvi escrever esse post rapidinho para ensinar. Lembrando que os processos descritos abaixo funcionam no Linux, Mac e Windows com WSL, no Windows puro algumas outras configuração seriam necessárias, mas não irei abordar aqui.
Enquanto eu vou escrevendo esse post vou ouvindo Pitty, isso mesmo, aquela rockeira baiana que era bem famosa nos 2000, como já disse, escuto de tudo xD
Antes mesmo de começar a falar de SSH e etc, a gente precisa falar a razão de configurar o Git num é mesmo? Bom, quando nós criamos um commit, ao ver no log, ele fica numa estrutura similar a essa:
commit 82a24142b6df8049787760c82d29728f8fb0eee5 (HEAD -> master, origin/master, origin/HEAD)
Author: Willian Justen de Vasconcellos <willianjustenqui@gmail.com>
Date: Sun Sep 5 23:31:04 2021 -0300
Remove dangerously to use Script
Se você notar, tem uma parte separada especificamente para o Author
. Se você não configurar, o Git vai pegar o que tiver de informação no computador e na maioria das vezes ele não vai colocar direito nem o nome e muito menos o email.
Para configurar uma conta única e global é super simples, basta digitar:
git config user.name --global "Willian Justen de Vasconcellos"
git config user.email --global "willianjustenqui@gmail.com"
Mas e se precisar mudar para o email da empresa no projeto X? A forma não automatizada é dentro do projeto definir manualmente:
git config user.name "Willian Justen de Vasconcellos"
git config user.email "will.justen@zapt.com.br"
E aí talvez você pergunte:
Mas e se tiverem vários projetos da empresa, preciso fazer isso em cada projeto?
A resposta antes desse post seria que sim, você precisa definir manualmente. Mas como vocês sabem, programador é bicho preguiçoso e sempre vai querer automatizar as coisas e bom, é o que faremos xD
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:
~/Development
/github
/zapt
Como é um padrão bem simples, fica fácil de falar para o Git o seguinte:
- Se estiver na pasta
github
use meu email pessoal - Se estiver na pasta
zapt
use o email da empresa
E aí para definir isso, eu crio 2 arquivos:
.gitconfig-github
.gitconfig-zapt
E os conteúdos ficam:
[user]
email = willianjustenqui@gmail.com
E no outro:
[user]
email = will.justen@zapt.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 = Willian Justen de Vasconcellos
[init]
defaultBranch = main
[includeIf "gitdir:~/Development/github/"]
path = .gitconfig-github
[includeIf "gitdir:~/Development/zapt/"]
path = .gitconfig-zapt
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. Só de fazer isso, se eu criar um commit na Zapt, já ficaria com o commit assim:
commit e07164f972a15bbf7c681970a5cf547db966867d (origin/fix/update-map-use-lat-long, fix/update-map-use-lat-long)
Author: Willian Justen de Vasconcellos <will.justen@zapt.com.br>
Date: Thu Aug 26 12:16:44 2021 -0300
Fix Map position to use flat lat and long
Como podem ver, o email já fica certinho o da empresa e não o meu pessoal.
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" -f "id_rsa_pessoal"
ssh-keygen -t rsa -C "email@trabalho.com" -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
Lá dentro do arquivo é só editar:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_pessoal
Host github.com-trabalho
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_trabalho
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 de trabalho, basta editar na url para ficar de acordo com a estrutura acima:
git clone git@github.com-trabalho: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!