Como configuro minha identidade no Git
(benji.dog)- Em um ambiente em que tanto repositórios pessoais quanto de trabalho ficam em
~/workspace, é mais preciso separar a identidade do Git com base na URL do remote do que na localização da pasta - O
includeIfdo Git pode carregar configurações por caminho comgitdir, mas quando repositórios de várias contas se misturam dentro do mesmo diretório de trabalho, a ramificação por caminho esbarra em limites - Ao usar a condição
hasconfig:remote.*.url:, é possível incluir arquivos de configuração separados conforme o padrão da URL do remote, como GitHub, GitLab, SourceHut ou uma organização específica do GitHub - As chaves SSH precisam ser gerenciadas separadamente em
~/.ssh/configcomHost,Hostname,UsereIdentityFile, e para usar chaves por organização mesmo no mesmogithub.com, é necessário um alias de Host - Ao configurar
url.<base>.insteadOfjunto, você pode continuar usandogit@github.com:orgname/projectnormalmente, enquanto internamente isso é substituído porgh-work:orgname, acionando a configuração SSH correta
Separando a configuração do Git com base na URL do remote
- Exemplos tradicionais de
includeIfincluem arquivos de configuração diferentes conforme o caminho do diretório local, comogitdir:~/code/**egitdir:~/work/**- Em
~/code, é possível carregar~/.config/git/personal, e em~/work,~/.config/git/work - Esses arquivos normalmente contêm a identidade do Git e a chave de assinatura, como
user.name,user.emaileuser.signingkey
- Em
- Se todo o código fica em
~/workspace, repositórios pessoais,work-1ework-2podem se misturar na mesma estrutura de caminhos, o que dificulta obter a separação desejada apenas com condições baseadas em caminho - Com
hasconfig:remote.*.url:do Git, é possível incluir um arquivo de configuração apenas quando o repositório atual tiver uma URL de remote específica- Se corresponder a
git@github.com:*/**, incluir~/.config/git/config-gh - Se corresponder a
git@github.com:orgname/**, incluir~/.config/git/config-gh-org - Se corresponder a
git@gitlab.com:*/**, incluir~/.config/git/config-gl - Se corresponder a
git@git.sr.ht:*/**, incluir~/.config/git/config-srht
- Se corresponder a
- O Git inclui a última configuração correspondente, então a ordem das condições é importante
- A condição
github.com:orgname/**precisa vir abaixo da condição geralgithub.com:*/**para que a configuração exclusiva da organização não seja sobrescrita pela configuração geral do GitHub
- A condição
- No fim, repositórios com remote
github.com:orgname/**usamconfig-gh-org, enquanto os demais repositórios do GitHub usam a configuração geral do GitHub
Ajustando informações de acesso por organização com chaves SSH e insteadOf
- Além da identidade do Git, é preciso configurar chaves SSH para fazer
pullepushno remote- Em
~/.ssh/config, é possível apontargitlab.compara~/.ssh/gitlab.id_ed25519 - E
github.compara algo como~/.ssh/github.id_ed25519usandoIdentityFile
- Em
- Dependendo da configuração do
ssh-agent, pode ser recomendável adicionarIdentitiesOnly yessob oIdentityFilede cadaHost - Para usar chaves diferentes por organização no mesmo
Hostnamegithub.com, é necessário usar valores diferentes deHost- A configuração fica no formato
Host gh-work,Hostname github.com,User git,IdentityFile ~/.ssh/work.id_ed25519
- A configuração fica no formato
- Com
url "gh-work:orgname"einsteadOf = git@github.com:orgnamena configuração do Git, dá para fazer a substituição automática da URL do Git- O usuário digita algo como
git clone git@github.com:orgname/project - O Git substitui a parte
github.com:orgnameporgh-work:orgnamee usa a configuraçãogh-workde~/.ssh/config
- O usuário digita algo como
- Essa abordagem usa um truque citado em SSH and multiple Git credentials, e os textos consultados em conjunto são os seguintes
1 comentários
Opiniões no Hacker News
Em vez de
insteadOf, clonar o repositório comogh-work:org/repoe, na configuração do Git, usarincludeIf "hasconfig:remote.*.url:gh-work:**/**"Assim, repositórios clonados com a identidade SSH definida em
gh-workpassam a carregar automaticamente a configuraçãogh-work.inc, que contém a identidade do Git e a chave de assinatura, além de configurações de SSHNo fim, o nome
gh-workvira o critério para distinguir a identidade SSH da identidade Git, o que fica mais fácil de entenderincludeIfdiferencia maiúsculas de minúsculas, e, na prioridade, a última configuração vencePara verificar se está funcionando corretamente, basta executar
git remote get-url originegit config --get user.emailAcho que uma forma melhor é colocar aliases por identidade no
.gitconfigdoHOMEe, logo após inicializar ou clonar um repositório, executargit config-companyougit config-personalAtive
user.useConfigOnly = truee, nos aliases, configureuser.email,user.nameecore.sshCommanddo repositório local com as chaves SSH pessoais/de trabalho, respectivamenteA vantagem do método do texto parece ser que, ao clonar a partir da organização, simplesmente funciona
Tempos atrás, em uma startup, havia uma pessoa que mudava sua identidade todos os dias para algum nome qualquer de conto de fadas
Commits de segunda eram de Mr. Bunnymann, os de terça de Doctor Funtime e assim por diante, o que era muito inconveniente ao fazer forense de controle de versão
Sendo generoso, talvez ela estivesse tentando lembrar que qualquer pessoa pode colocar qualquer valor nas configurações de identidade, então não se deve confiar demais nesses valores
Ainda assim, saber quem fez ajuda na hora de perguntar detalhes ou prever estilo e especialidade
Se você exigir assinatura GPG nos commits e registrar as identidades GPG permitidas, é possível identificar o autor real pela assinatura em vez dos metadados de autor/committer
Claro que “simplesmente” e assinatura GPG nem sempre combinam bem
Se não dá para confiar que um funcionário identifique corretamente os próprios commits, acho que ele deveria ser demitido
Sem precisar mexer em
~/.ssh/config, basta colocar em~/.gitconfigou, como no texto, em~/.config/git/personalalgo comocore.sshCommand = /usr/bin/ssh -o IdentitiesOnly=yes -i ~/.ssh/IdentityFile2 -aAssim, submódulos ficam mais fáceis mesmo sem
insteadOfEu já usava
includeIfbaseado em diretório havia tempos (https://www.bobek.cz/til/git-identities/), mashasconfig:remoteé realmente muito limpoTambém funciona ao clonar um repositório
includeIfé muito bomHoje deixo a complexidade do SSH em
~/.sshe mantenho um include para cada cliente/projeto/identidadePara casos sem um hostname exclusivo, como o GitHub, coloco um alias de host como
customer-githube configuroHostName github.com,IdentityFile ~/.ssh/customer_rsa,User gitetc.Depois, é só usar esse alias no
git cloneEu tinha o mesmo problema, e agora parece que há uma solução
Usando NixOS e home-manager no Linux e no Mac, essa configuração fica simples
Em
programs.git.includes, basta colocarcondition = "hasconfig:remote.*.url:git@github.com:/**"e a configuração deuser.emailReferência: https://nix-community.github.io/home-manager/options.xhtml#opt-programs.git.includes
.gitconfigÉ a mesma condição e configuração do texto, só que com uma etapa de build/template e ainda a necessidade de aprender uma nova linguagem de programação com sintaxe peculiar
Eu já separava as configurações de trabalho e pessoais com
includeIf: "gitdir", mashasconfig:remotemuda completamente o jogoPara consultores, sempre recomendo fortemente usar uma máquina separada para trabalho ou, no mínimo, um usuário de sistema operacional separado
Usar uma máquina pessoal para trabalho pode trazer um grande risco de problemas
Em uma empresa remote-first, alguém pode preparar o próprio notebook e receber reembolso para comprar um novo aparelho a cada 2 ou 3 anos, mas ainda assim ele ser um notebook pessoal; também pode ser um contrato temporário
É preciso explicar de forma mais específica em quais situações isso vira problema e por quê
O risco existe, mas, se você não consegue enumerá-lo, fica mais perto de espalhar FUD do que de educar
Esta é uma ferramenta que criei para trocar facilmente a identidade Git por projeto: https://github.com/cquintana92/git-switch-user
Depois de configurar as identidades, ao executar
$ git su Personalou$ git su Work, o e-mail, o nome, a chave SSH e, opcionalmente, até a chave PGP são configurados no.git/configdo repositórioEconomizou muito tempo para mim
É uma ferramenta de 12 anos, mas ainda é mantida ativamente