É possível ter uma configuração diferente do Git para diferentes projetos?

315

.gitconfiggeralmente é armazenado no user.homediretório

Eu uso uma identidade diferente para trabalhar em projetos para a Empresa A e outra coisa para a Empresa B (principalmente o nome / email). Como posso ter duas configurações diferentes do Git para que meus check-ins não sejam com o nome / email?

priya
fonte

Respostas:

264

O .git/configarquivo em um clone específico de um repositório é local para esse clone. Quaisquer configurações colocadas lá afetarão apenas as ações desse projeto em particular.

(Por padrão, git configmodifica .git/config, não ~/.gitconfigapenas com --globalo último.)

Âmbar
fonte
assim, modificar o arquivo de configuração na configuração do repositório em si, por exemplo, alterar [user] email = ...bloco, substituirá o global ~/.gitconfig- e isso é apenas para o seu usuário?
Dcsan # 30/19
284

Existem 3 níveis de configuração do git; projeto, global e sistema.

  • projeto : as configurações do projeto estão disponíveis apenas para o projeto atual e armazenadas em .git / config no diretório do projeto.
  • global : as configurações globais estão disponíveis para todos os projetos do usuário atual e armazenadas em ~ / .gitconfig.
  • sistema : as configurações do sistema estão disponíveis para todos os usuários / projetos e armazenadas em / etc / gitconfig.

Crie uma configuração específica do projeto, você deve executá-la no diretório do projeto:

$ git config user.name "John Doe" 

Crie uma configuração global:

$ git config --global user.name "John Doe"

Crie uma configuração do sistema:

$ git config --system user.name "John Doe" 

E, como você pode imaginar, o projeto substitui o sistema global e global.

teymourlouie
fonte
69
Existe a possibilidade de fazer alguma configuração de "diretório"? Eu faço um trabalho em casa e tenho pastas com projetos de trabalho e os meus. Então, eu tenho pastas ~ / job e ~ / my com git repos e quero configurações diferentes para projetos sob elas. Por exemplo, job / project1 possui a configuração do job / .gitconfig.
Serge
2
@ Emerge você já descobriu se era possível criar uma configuração no nível do diretório? Eu tenho o mesmo problema agora.
questionando
2
Não Defino a configuração geral do sistema para dados pessoais e faço o script bash para definir os dados da tarefa para determinadas configurações do projeto em um comando.
Serge
1
Como um adendo: apenas git config user.nameou git config user.emailmostrará o nome ou e-mail que o Git usará para o repositório atual.
Abhishek Divekar 11/03/19
1
Acabei fazendo isso pelo zsh : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , espero que isso ajude alguém.
Pgarciacamou
219

A partir da versão 2.13 do git, o git suporta inclusões de configuração condicional . Neste exemplo, clonamos os acordos de recompra da empresa A no ~/company_adiretório e os acordos de recompra da empresa B em ~/company_b.

No seu .gitconfigvocê pode colocar algo parecido com isto.

[includeIf "gitdir:~/company_a/"]
  path = .gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
  path = .gitconfig-company_b

Exemplo de conteúdo de .gitconfig-company_a

[user]
name = John Smith
email = [email protected]

Exemplo de conteúdo de .gitconfig-company_b

[user]
name = John Smith
email = [email protected]
crea1
fonte
1
É ótimo ver que isso foi adicionado na versão 2.13. Estou usando o github.com/bddenhartog/git-profiles por um tempo, mas não consegui fazê-lo funcionar com o Tower.
Adrum
4
includeIf é um pouco mimado, consulte: stackoverflow.com/questions/43919191/...
rublo
A página de documentação é ligada ao não mencionar isso ... na verdade, procurando includeIf não deu qualquer resultado na documentação
Thomas Levesque
1
@ThomasLevesque Isso é estranho. Tenho certeza que disse algo sobre isso antes. Você pode encontrá-lo no changelog github.com/git/git/blob/master/Documentation/RelNotes/… e também em kernel.org/pub/software/scm/git/docs/git-config.html
crea1
2
@JosephLust, você precisa instalar o git> = 2.13 (o Ubuntu 16.04 possui o git 2.7) . Obtenha a versão mais recente do git via Git PPA e ele funcionará :) #
217 de Cas
24

Obrigado @ crea1

Uma pequena variante:

Como está escrito em https://git-scm.com/docs/git-config#_includes :

Se o padrão terminar com /, **será adicionado automaticamente. Por exemplo, o padrão foo/se torna foo/**. Em outras palavras, ele combina fooe tudo dentro, recursivamente.

Então, eu uso no meu caso,
~ / .gitconfig :

[user] # as default, personal needs
    email = [email protected]
    name = bcag2
[includeIf "gitdir:~/workspace/"] # job needs, like workspace/* so all included projects
    path = .gitconfig-job

# all others section: core, alias, log…

Portanto, se o diretório do projeto estiver no meu ~/wokspace/, as configurações padrão do usuário serão substituídas por
~ / .gitconfig-w :

[user]
name = John Smith
email = [email protected]
bcag2
fonte
Feito isso, agora o nome de usuário e o email corretos estão definidos em diretórios diferentes. Quando eu faço o git config user.name / git config user.email, recebo os detalhes corretos. Mas quando eu comentar em repo pessoal, ele sempre pega email mundial nome oficial
Bhupendra
@Bhupendra Na minha amostra, .gitconfig e .gitconfig-job estão em minha casa, não nos diretórios do projeto. Você precisa de mais de dois? Você criou um .gitconfig-alternativ em seu diretório pessoal, como meu .gitconfig-job na minha amostra, com 3 linhas.
bcag2
@ bcag2 Eu também segui o mesmo exemplo dado acima. Eu tenho 2 configurações de trabalho o padrão e pessoal semelhante ao gitconfig-job. Quando estou no diretório pessoal, no git config user.name me dá o nome correto, mas para enviar o commit é necessário o padrão, enquanto eu preciso do pessoal.
swapnil2993 13/01
@ swapnil2993 primeiro eu acho que na questão do caminho, mas se git config user.nameretornar um correto, deve estar ok. Você está sob o GNU / Linux ou outro sistema operacional?
bcag2 14/01
@ bcag2 Resolvido o problema. Apenas corrigi o caminho. Mas o git config user.name retornando o valor correto era estranho. Obrigado pela resposta.
swapnil2993 15/01
14

Para ser explícito, você também pode usar --locala usar atual arquivo de configuração do repositório :

git config --local user.name "John Doe" 
mim
fonte
12

Você também pode apontar a variável de ambiente GIT_CONFIGpara um arquivo que git configdeve ser usado. Com GIT_CONFIG=~/.gitconfig-A git config key valueo arquivo especificado é manipulado.

Stefan Näwe
fonte
2
Legal; com um pouco de mágica inteligente do shell, isso pode ser usado para configurar as coisas, para que o git escolha o primeiro .gitconfig encontrado ao percorrer a árvore de diretórios acima do repositório atual. Obrigado!
20913 ecmanaut
1
Você tem um link para essa mágica de shell que faz isso? Parece útil!
precisa saber é o seguinte
1
@pchiusano aqui está uma versão rudimentar do que em peixes github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/...
CtrlC-root
Obrigado por uma solução simples que requer apenas a alteração de uma variável de ambiente.
Noah Sussman
agora só afeta o comando git config github.com/git/git/blob/master/Documentation/RelNotes/…
foray1010
12

Estou fazendo isso para o meu email da seguinte maneira:

git config --global alias.hobbyprofile 'config user.email "[email protected]"'

Então, quando clonar um novo projeto de trabalho, só tenho que executar git hobbyprofilee ele será configurado para usar esse email.

ivand58
fonte
3

Outra maneira é usar o direnv e separar os arquivos de configuração por diretório. Por exemplo:

.
├── companyA
│  ├── .envrc
│  └── .gitconfig
├── companyB
│  ├── .envrc
│  └── .gitconfig
└── personal
   ├── .envrc
   └── .gitconfig

Cada um .envrcdeve conter algo como isto:

export GIT_CONFIG=$(pwd)/.gitconfig

E .gitconfigé gitconfig usual com os valores desejados.

Lashevich alemão
fonte
2

Você pode personalizar a configuração do Git de um projeto alterando o arquivo de configuração específico do repositório (ou seja /path/to/repo/.git/config). BTW, git configgrava neste arquivo por padrão:

cd /path/to/repo
git config user.name 'John Doe'  # sets user.name locally for the repo

Prefiro criar perfis separados para diferentes projetos (por exemplo, in ~/.gitconfig.d/) e incluí- los no arquivo de configuração do repositório:

cd /path/to/repo
git config include.path '~/.gitconfig.d/myproject.conf'

Isso funciona bem se você precisar usar o mesmo conjunto de opções em vários repositórios que pertencem a um único projeto. Você também pode configurar aliases de shell ou um comando Git personalizado para manipular os perfis.

Eugene Yarmash
fonte
0

Eu estou no mesmo barco. Eu escrevi um pequeno script bash para gerenciá-los. https://github.com/thejeffreystone/setgit

#!/bin/bash

# setgit
#
# Script to manage multiple global gitconfigs
# 
# To save your current .gitconfig to .gitconfig-this just run:
# setgit -s this
#
# To load .gitconfig-this to .gitconfig it run:
# setgit -f this
# 
# 
# 
# Author: Jeffrey Stone <[email protected]>

usage(){
  echo "$(basename $0) [-h] [-f name]" 
  echo ""
  echo "where:"
  echo " -h  Show Help Text"
  echo " -f  Load the .gitconfig file based on option passed"
  echo ""
  exit 1  
}

if [ $# -lt 1 ]
then
  usage
  exit
fi

while getopts ':hf:' option; do
  case "$option" in
      h) usage
         exit
         ;;
      f) echo "Loading .gitconfig from .gitconfig-$OPTARG"
         cat ~/.gitconfig-$OPTARG > ~/.gitconfig
         ;;
      *) printf "illegal option: '%s'\n" "$OPTARG" >&2
         echo "$usage" >&2
         exit 1
         ;;
    esac
done
netizen24601
fonte
Seu script aqui está no Bash, enquanto no Github você tem a versão Python. Também -snão é tratado no seu script Bash.
Vadim Kotov
0

Ocorreu um erro ao tentar git stashminhas alterações locais. O erro do git dizia "Diga-me quem você é" e me disse para "Executar git config --global user.email "[email protected]e git config --global user.name "Your name"definir a identidade padrão da sua conta". No entanto, você deve Omitir --global para definir a identidade apenas no seu repositório atual.

Erich Meissner
fonte