Se você usa o mesmo computador para projetos pessoais e do trabalho, provavelmente já cometeu o erro de fazer um commit com o e-mail errado. A boa notícia é que o git tem suporte nativo para resolver isso automaticamente, sem scripts ou gambiarras.
A ideia é simples: você define um perfil (nome, e-mail, chave SSH) para cada contexto, e o git escolhe o correto baseado em qual pasta o repositório está.
A estrutura de diretórios
O ponto de partida é organizar seus repositórios em pastas separadas por contexto:
~/Dev/
Pessoal/ ← repos pessoais aqui
Trabalho/ ← repos do trabalho aqui
Não precisa ser exatamente assim, mas a lógica de separação por pasta é o que vai fazer tudo funcionar.
Configurando o ~/.gitconfig
O arquivo principal do git suporta duas diretivas muito úteis: include e includeIf.
include— carrega outro arquivo de configuração sempre, independente de onde você está.includeIf— carrega um arquivo só se a condição for verdadeira (no nosso caso, se o repositório está dentro de determinada pasta).
Seu ~/.gitconfig deve ficar assim:
[init]
defaultBranch = main
[commit]
gpgsign = true
[user]
name = Seu Nome
useConfigOnly = true
[include]
path = ~/.gitconfig.pessoal
[includeIf "gitdir:~/Dev/Trabalho/"]
path = ~/.gitconfig.trabalho
Atenção: a barra / no final do caminho do includeIf é obrigatória. Sem ela, o git tenta casar com a pasta exata e ignora os repositórios dentro dela.
O useConfigOnly = true faz o git reclamar em vez de adivinhar o e-mail, caso você abra um repo fora das pastas configuradas. É útil para não passar despercebido.
Os arquivos de perfil
~/.gitconfig.pessoal
[user]
email = voce@email-pessoal.com
signingKey = <ID DA SUA CHAVE GPG PESSOAL>
~/.gitconfig.trabalho
[user]
email = voce@empresa.com
signingKey = <ID DA SUA CHAVE GPG DO TRABALHO>
[url "git@github.com-trabalho"]
insteadOf = git@github.com
A seção [url] no perfil do trabalho é o que faz o git usar a chave SSH correta — ela substitui a URL padrão do github.com por um alias (github.com-trabalho) que você vai configurar no SSH.
Configurando o SSH
Crie ou edite o arquivo ~/.ssh/config:
# Conta pessoal
Host github.com
Hostname github.com
User git
IdentityFile ~/.ssh/id_pessoal
# Conta do trabalho
Host github.com-trabalho
Hostname github.com
User git
IdentityFile ~/.ssh/id_trabalho
# Configurações gerais
Host *
AddKeysToAgent yes
IdentitiesOnly yes
PreferredAuthentications publickey
A ordem importa: configurações mais específicas devem vir antes das genéricas.
Para gerar as chaves SSH (um par para cada contexto):
ssh-keygen -t ed25519 -C "voce@email-pessoal.com" -f ~/.ssh/id_pessoal
ssh-keygen -t ed25519 -C "voce@empresa.com" -f ~/.ssh/id_trabalho
Depois, adicione a chave pública de cada uma no GitHub/GitLab correspondente (~/.ssh/id_pessoal.pub para a conta pessoal, ~/.ssh/id_trabalho.pub para a do trabalho).
Como funciona na prática
Quando você está em ~/Dev/Trabalho/meu-projeto e faz um git push:
- O git carrega o
~/.gitconfig.trabalhopor causa doincludeIf. - A URL
git@github.comé substituída porgit@github.com-trabalho. - O SSH encontra o bloco
Host github.com-trabalhoe usa a chave correta. - O commit é assinado com a chave GPG do trabalho.
Fora das pastas configuradas, o perfil pessoal é usado (via include geral).
Verificando se está funcionando
Dentro de qualquer repositório, rode:
# Ver qual URL está sendo usada (confirma o perfil SSH)
git remote -v
# Ver de onde o e-mail está vindo
git config --show-origin --get user.email
Abordagens mais modernas (Git 2.34+)
Assinar commits com SSH em vez de GPG
A partir do Git 2.34 (novembro de 2021), é possível usar sua chave SSH para assinar commits, sem precisar configurar GPG. É muito mais simples.
No seu arquivo de perfil, substitua a configuração de assinatura:
[user]
email = voce@email.com
signingKey = ~/.ssh/id_ed25519.pub
[gpg]
format = ssh
O GitHub e o GitLab já suportam verificação de assinaturas SSH. Você adiciona a mesma chave pública como "signing key" nas configurações da sua conta.
Condição por URL remota (Git 2.36+)
A partir do Git 2.36 (abril de 2022), existe uma nova condição para o includeIf: hasconfig:remote.*.url. Ela aplica um perfil baseado na URL do remote do repositório, em vez de depender da estrutura de pastas.
[includeIf "hasconfig:remote.*.url:git@github.com-trabalho:empresa/**"]
path = ~/.gitconfig.trabalho
Isso é útil se seus repositórios não seguem uma organização rígida de pastas, ou se você clona repositórios em locais variados. A condição casa com qualquer remote que siga o padrão informado.
Com essa configuração, você nunca mais vai precisar pensar em qual perfil usar — o git resolve sozinho baseado em onde o repositório está.