Como dizer ao git para usar a identidade correta (nome e e-mail) para um determinado projeto?


117

Eu uso meu laptop pessoal para trabalho e projetos pessoais e gostaria de usar meu endereço de e-mail do trabalho para meus commits no trabalho (gitolite) e meu endereço de e-mail pessoal para o resto (github).

Eu li sobre as seguintes soluções, que são globais ou temporárias:

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • definindo um dos GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAILou EMAILvariáveis de ambiente

Uma solução é executar manualmente uma função shell que configura meu ambiente para trabalho ou pessoal , mas tenho certeza de que muitas vezes me esquecerei de mudar para a identidade correta, resultando em commitar com a identidade errada.

Existe uma maneira de vincular um determinado repositório, nome de projeto, etc. a uma identidade (nome, e-mail)? O que as pessoas fazem?


1
Solicito que aceite uma das respostas. Espero que um deles o tenha ajudado a resolver seu problema.
RBT

Respostas:


134

git config user.email "bob@example.com"

Fazer isso dentro de um repo definirá a configuração nesse repo, e não globalmente.

Parece que é isso que você está procurando, a menos que eu esteja interpretando mal.


Eu acho que isso deve bastar. Espero ter vários repositórios locais para o mesmo projeto, principalmente para alternar entre os ramos mais facilmente sem ter que recompilar tudo. Talvez seja apenas um mau hábito de svn. Obrigado.
Martin Jambon

1
@ Martin - Não uso o git há muito tempo, mas a sensação que tenho é que usar vários repositórios locais seria um fluxo de trabalho incomum para o git. Mesmo assim, você só precisa executar isso uma vez em uma instância do repo, e é definido para a vida útil desse repo, portanto, não é tão ruim.
Dan Ray

@DanRay Na verdade, é uma configuração comum se, como no caso de Martin, o repositório local tiver arquivos locais não confirmados. Mudar de uma ramificação para outra não reconstruiria os arquivos automaticamente. Se evitar "recompilar tudo" é uma meta, usar vários repositórios locais é a maneira correta de fazê-lo.
Dolmen de

1
git config --global user.email "bob@example.com" Adicionar --global faz com que funcione em todos os repositórios. fonte: help.github.com/articles/setting-your-username-in-git
SashiOno

1
Esta é uma tarefa manual e pode ser esquecida. Soluções automáticas são sugeridas por @ dragon788 e me
naitsirch

47

Você precisa usar o comando de definição local abaixo:

conjunto local

git config user.email mahmoud@company.ccc
git config user.name 'Mahmoud Zalt'

obter local

git config --get user.email
git config --get user.name

O arquivo de configuração local é no diretório do projeto: .git/config.

conjunto global

git config --global user.email mahmoud@zalt.me
git config --global user.name 'Mahmoud Zalt'

obter global

git config --global --get user.email
git config --global --get user.name

O arquivo de configuração global em no seu diretório home: ~/.gitconfig.

Lembre-se de citar espaços em branco, etc., por exemplo: 'Nome Sobrenome'


23

Edite o arquivo de configuração na pasta ".git" para manter o nome de usuário diferente e o e-mail depende do repositório

  • Vá para o seu repositório
  • Mostre os arquivos ocultos e vá para a pasta ".git"
  • Encontre o arquivo "config"
  • Adicione as linhas abaixo no EOF

[do utilizador]

nome = Bob

email = bob@example.com

O comando abaixo mostra qual nome de usuário e e-mail configurados para este repositório.

git config --get user.name

git config --get user.email

Exemplo: para o meu, esse arquivo de configuração em D: \ workspace \ eclipse \ ipchat \ .git \ config

Aqui, ipchat é o meu nome de repo


16

Se você usar git config user.email "foo@example.com", será vinculado ao projeto atual em que você está.

É isso que faço pelos meus projetos. Defino a identidade apropriada ao clonar / iniciar o repo. Não é à prova de idiotas (se você esquecer e insistir antes de descobrir, você está perdido), mas é o melhor que você pode obter sem a capacidade de dizergit config --global user.email 'ILLEGAL_VALUE'

Na verdade, você pode criar um valor ilegal. Defina seugit config --global user.name $(perl -e 'print "x"x968;')

Então, se você se esquecer de definir seus valores não globais, receberá uma mensagem de erro.

[EDITAR] Em um sistema diferente, tive que aumentar o número de x para 968 para que falhasse com "fatal: identificador pessoal impossivelmente longo". Mesma versão do git. Estranho.


Parece um ótimo truque, mas não funcionou para mim. O commit e o push para gitolite remote foram bem-sucedidos.
Martin Jambon

@Martin Jambon: Estranho. Estou usando o git versão 1.7.4.5
Seth Robertson

@Martin Jambon: Você também pode tentar definir seu nome de usuário / endereço de e-mail global para "x". Algumas versões mais antigas do git rejeitavam valores muito pequenos. Relate qual versão / sistema operacional do git você possui se isso não funcionar.
Seth Robertson

@Martin Jambon: Experimente 968 "x" e veja se funciona melhor para você.
Seth Robertson

8

Se você não usar o --globalparâmetro, ele definirá as variáveis ​​apenas para o projeto atual.


8

A partir do Git 2.13, você pode usar um includeIfem seu gitconfig para incluir um arquivo com uma configuração diferente com base no caminho do repositório onde está executando seus comandos git.

Já que um Git novo o suficiente vem com o Ubuntu 18.04, estou usando isso com ~/.gitconfigmuita alegria.

[include]
  path = ~/.gitconfig.alias # I like to keep global aliases separate
  path = ~/.gitconfig.defaultusername # can maybe leave values unset/empty to get warned if a below path didn't match
# If using multiple identities can use per path user/email
# The trailing / is VERY important, git won't apply the config to subdirectories without it
[includeIf "gitdir:~/projects/azure/"]
  path = ~/.gitconfig.azure # user.name and user.email for Azure
[includeIf "gitdir:~/projects/gitlab/"]
  path = ~/.gitconfig.gitlab # user.name and user.email for GitLab
[includeIf "gitdir:~/projects/foss/"]
  path = ~/.gitconfig.github # user.name and user.email for GitHub

https://motowilliams.com/conditional-includes-for-git-config#disqus_thread

Para usar o Git 2.13, você precisará adicionar um PPA (Ubuntu anterior a 18.04 / Debian) ou baixar os binários e instalar (Windows / outro Linux).


Muito útil e exatamente o que eu estava procurando. Combinado com git config core.sshCommandvárias chaves privadas, oferece um gerenciamento de identidade git perfeito e completo.
topr

0

Uma solução é executar manualmente uma função shell que define meu ambiente para trabalho ou pessoal, mas tenho certeza de que muitas vezes me esquecerei de mudar para a identidade correta, resultando em um commit com a identidade errada.

Esse era exatamente o meu problema. Eu escrevi um script de gancho que avisa se você tem algum github remoto e não definiu um nome de usuário local.

Veja como você configura:

  1. Crie um diretório para manter o gancho global

    mkdir -p ~/.git-templates/hooks

  2. Diga ao git para copiar tudo em ~/.git-templatesseu .gitdiretório por projeto ao executar git init ou clone

    git config --global init.templatedir '~/.git-templates'

  3. E agora copie as seguintes linhas para ~/.git-templates/hooks/pre-commite torne o arquivo executável (não se esqueça disso, caso contrário o git não executará!)

#!/bin/bash

RED='\033[0;31m' # red color
NC='\033[0m' # no color

GITHUB_REMOTE=$(git remote -v | grep github.com)
LOCAL_USERNAME=$(git config --local user.name)

if [ -n "$GITHUB_REMOTE" ] && [ -z "$LOCAL_USERNAME" ]; then
    printf "\n${RED}ATTENTION: At least one Github remote repository is configured, but no local username. "
    printf "Please define a local username that matches your Github account.${NC} [pre-commit hook]\n\n"
    exit 1
fi

Se você usar outros hosts para seus repositórios privados, terá que substituí-los de github.comacordo com suas necessidades.

Agora, toda vez que você fizer um git initou o git clonegit irá copiar este script para o repositório e executá-lo antes que qualquer commit seja feito. Se você não definiu um nome de usuário local, ele emitirá um aviso e não permitirá que você confirme.


0

Eu gosto muito da maneira de Micah Henning em seu artigo (consulte Configurando identidades do Git ) sobre esse assunto. O fato de ele aplicar e forçar a identidade a cada repositório criado / clonado é uma boa maneira de não se esquecer de configurar isso a cada vez.

Configuração básica do git

Desconfigure a configuração do usuário atual no git:

$ git config --global --unset user.name
$ git config --global --unset user.email
$ git config --global --unset user.signingkey

Forçar configuração de identidade em cada novo repositório local:

$ git config --global user.useConfigOnly true

Crie um alias Git para o identitycomando, que usaremos mais tarde:

$ git config --global alias.identity '! git config user.name "$(git config user.$1.name)"; git config user.email "$(git config user.$1.email)"; git config user.signingkey "$(git config user.$1.signingkey)"; :'

Criação de identidades

Crie uma identidade com GPG (use gpgou gpg2dependendo do que você tem em seu sistema). Repita as próximas etapas para cada identidade que deseja usar.

Nota: [keyid]aqui está o identificador da chave secreta criada. Exemplo aqui:

sec   rsa4096/8A5C011E4CE081A5 2020-06-09 [SC] [expires: 2021-06-09]
      CCC470AE787C057557F421488C4C951E4CE081A5
uid                 [ultimate] Your Name <youremail@domain>
ssb   rsa4096/1EA965889861C1C0 2020-06-09 [E] [expires: 2021-06-09]

A 8A5C011E4CE081A5parte seguinte sec rsa4096/é o identificador da chave.

$ gpg --full-gen-key
$ gpg --list-secret-keys --keyid-format LONG <youremail@domain>
$ gpg --armor --export [keyid]

Copie o bloco de chave pública e adicione-o às configurações do GitHub / GitProviderOfChoice como uma chave GPG.

Adicione identidade à configuração do Git. Repita também para cada identidade que deseja adicionar:

Nota: aqui eu uso gitlabpara nomear a minha identidade, mas a partir de sua pergunta pode ser qualquer coisa, ex: gitoliteou github, worketc.

$ git config --global user.gitlab.name "Your Name"
$ git config --global user.gitlab.email "youremail@domain"
$ git config --global user.gitlab.signingkey [keyid]

Configurar identidade para um repositório

Se um novo repo não tiver identidade associada, um erro aparecerá no commit, lembrando você de configurá-lo.

*** Please tell me who you are.

## parts of message skipped ##

fatal: no email was given and auto-detection is disabled

Especifique a identidade que você deseja em um novo repositório:

$ git identity gitlab

Agora você está pronto para se comprometer com a identidade gitlab .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.