Tendo contas separadas (pessoal, trabalho, demo) na mesma máquina, dá para trocar identidade Git e chave SSH automaticamente conforme o diretório do repositório.
1. Organize por diretório. Uma pasta por conta:
~/github
├── /demo
├── /personal
└── /work
2. ~/.gitconfig global com a conta padrão e includeIf para sobrescrever
nas outras pastas:
[user]
name = <nome_pessoal>
email = <email_pessoal>
signingkey = <chave_ssh>
[gpg]
format = ssh
[gpg "ssh"]
program = "/Applications/1Password.app/Contents/MacOS/op-ssh-sign"
[commit]
gpgsign = true
[includeIf "gitdir:~/github/work"]
path = ~/github/work/.gitconfig
3. Um .gitconfig por pasta (ex: ~/github/work/.gitconfig) com o
[user] daquela conta. Ele só é carregado dentro daquele diretório.
4. ~/.ssh/config define o 1Password como agente SSH padrão e um host por
conta apontando para github.com:
# 1Password como agente SSH para todos os hosts
Host *
IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"
Host gh-work
HostName github.com
User git
IdentityFile ~/.ssh/work_git.pub
IdentitiesOnly yes
5. Aponte o remote de cada repo para o host certo:
git remote set-url origin gh-work:<org>/<repo>.git
git remote -v # confere
git fetch # confirma a chave SSH oferecida
Com as chaves no 1Password
Quando as chaves vivem no 1Password — possivelmente em contas diferentes (pessoal, trabalho, demo) — duas peças da config acima fazem todo o trabalho, e a chave privada nunca toca o disco:
- Autenticação SSH: a linha
IdentityAgentemHost *aponta o cliente SSH para o socket do agente do 1Password. Na hora de autenticar (git fetch,git push), o 1Password é quem responde, oferecendo a chave privada certa e pedindo aprovação por Touch ID. OIdentityFileno~/.ssh/configaponta para a chave pública (.pub), que serve só para o agente saber qual chave daquela conta usar. - Assinatura de commits: com
gpg.format = sshegpg.ssh.program = op-ssh-sign, o Git delega a assinatura ao binário do 1Password em vez do GPG. Comocommit.gpgsign = true, todo commit é assinado; ouser.signingkeyde cada.gitconfigdefine qual chave SSH assina naquele diretório. Resultado: a conta correta autentica e assina, sem trocar nada manualmente ao mudar de pasta.
Fonte: Working with multiple GitHub accounts and SSH keys — Andrew Stiefel