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.

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:

  1. O git carrega o ~/.gitconfig.trabalho por causa do includeIf.
  2. A URL git@github.com é substituída por git@github.com-trabalho.
  3. O SSH encontra o bloco Host github.com-trabalho e usa a chave correta.
  4. 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á.

Powered by Forestry.md