De onde vêm as configurações na minha configuração do Git?

Eu notei que eu tenho 2 listagens para core.autocrlf quando eu executo git config -l

 $ git config -l core.symlinks=false core.autocrlf=false color.diff=auto color.status=auto color.branch=auto color.interactive=true pack.packsizelimit=2g help.format=html http.sslcainfo=/bin/curl-ca-bundle.crt sendemail.smtpserver=/bin/msmtp.exe diff.astextplain.textconv=astextplain rebase.autosquash=true user.name=name user.email=email@example.com core.autocrlf=true 

Aqueles últimos 3 (de user.name para baixo) são os únicos no meu arquivo c:\users\username\.gitconfig . De onde todos os outros estão vindo? Por que o core.autocrlf é listado duas vezes?

Isso é feito com o msysgit 1.8.3 e também tenho o SourceTree instalado (Windows 7). No SourceTree eu desmarcou o “Permitir que o SourceTree modifique seus arquivos de configuração globais do Git”

O Git verifica 4 locais para um arquivo de configuração:

  1. O arquivo .gitconfig do sistema da sua máquina.
  2. Seu arquivo .gitconfig usuário localizado em ~/.gitconfig .
  3. Um segundo arquivo de configuração específico do usuário localizado em $XDG_CONFIG_HOME/git/config ou $HOME/.config/git/config .
  4. O arquivo de configuração do .git/config local .git/config .

As configurações são colocadas em cascata na seguinte ordem, com cada arquivo adicionando ou sobrescrevendo as configurações definidas no arquivo acima dele.

  1. Configuração do sistema.
  2. Configuração do usuário.
  3. Configuração específica de repetição.

Você pode ver o que cada arquivo definiu usando os seguintes comandos:

 # System, applies to entire machine and all users $ git config --system --list $ git config --system --edit # User defined $ git config --global --list $ git config --global --edit 

Você pode ver o que apenas o arquivo específico do repository definiu abrindo o arquivo .git/config para esse repository.

Se você estiver usando o msysgit no Windows, provavelmente encontrará o arquivo de usuário ~/.gitconfig para o qual ~/.gitconfig %homepath% aponta se você usar o echo %homepath% partir de um prompt de comando do Windows.

Na documentação para git config :

Se não for definido explicitamente com --file , existem quatro arquivos em que git config procurará por opções de configuração:

  • $(prefix)/etc/gitconfig

    Arquivo de configuração do sistema.

  • $XDG_CONFIG_HOME/git/config

    Segundo arquivo de configuração específico do usuário. Se $XDG_CONFIG_HOME não estiver definido ou vazio, $HOME/.config/git/config será usado. Qualquer variável de valor único definida neste arquivo será sobrescrita pelo que estiver em ~/.gitconfig . É uma boa idéia não criar este arquivo se você, às vezes, usa versões mais antigas do Git, já que o suporte para esse arquivo foi adicionado recentemente.

  • ~/.gitconfig

    Arquivo de configuração específico do usuário. Também chamado de arquivo de configuração “global”.

  • $GIT_DIR/config

    Arquivo de configuração específico do repository.

Se nenhuma outra opção for fornecida, todas as opções de leitura lerão todos esses arquivos disponíveis. Se o arquivo de configuração global ou do sistema não estiver disponível, eles serão ignorados. Se o arquivo de configuração do repository não estiver disponível ou legível, o git config sairá com um código de erro diferente de zero. No entanto, em nenhum dos casos, será emitida uma mensagem de erro.

Os arquivos são lidos na ordem dada acima, com o último valor encontrado tendo precedência sobre os valores lidos anteriormente. Quando vários valores são obtidos, todos os valores de uma chave de todos os arquivos serão usados.

Todas as opções de escrita por padrão gravarão no arquivo de configuração específico do repository. Observe que isso também afeta opções como --replace-all e --unset . git config mudará apenas um arquivo de cada vez.

Você pode replace essas regras por opções de linha de comando ou por variables ​​de ambiente. As opções --global e --system limitarão o arquivo usado para o arquivo global ou todo o sistema, respectivamente. A variável de ambiente GIT_CONFIG tem um efeito semelhante, mas você pode especificar qualquer nome de arquivo desejado.

Você não precisa mais adivinhar qual configuração foi definida para onde, com o git 2.8! (Março de 2016)

See commit 70bd879 , cometer 473166b , cometer 7454ee3 , cometer 7454ee3 (19 de fevereiro de 2016), cometer 473166b , cometer 7454ee3 (19 de fevereiro de 2016), cometer 7454ee3 (19 de fevereiro de 2016) e cometer a0578e0 (17 de fevereiro de 2016) por Lars Schneider ( larsxschneider ) .
(Mergulhado por Junio ​​C Hamano – gitster – em commit dd0f567 , 26 de fevereiro de 2016)

config: adiciona a opção ‘ --show-origin ‘ para imprimir a origem de um valor de configuração

Se os valores de configuração forem consultados usando ‘ git config ‘ (por exemplo, via --get , --get-all , --get-regexp ou --list flag), será difícil encontrar o arquivo de configuração onde os valores foram definidos. .

Ensina ‘ git config ‘ a opção ‘ --show-origin ‘ para imprimir o arquivo de configuração de origem para cada valor impresso.

A página man do git config agora indica:

 --show-origin: 

Aumente a saída de todas as opções de configuração consultadas com o tipo de origem (arquivo, input padrão, blob, linha de comando) e a origem real (caminho do arquivo de configuração, ref ou id do blob, se aplicável).

Por exemplo:

 git config --list --show-origin 

Isso retornará:

  file:$HOME/.gitconfig user.global=true file:$HOME/.gitconfig user.override=global file:$HOME/.gitconfig include.path=$INCLUDE_DIR/absolute.include file:$INCLUDE_DIR/absolute.include user.absolute=include file:.git/config user.local=true file:.git/config user.override=local file:.git/config include.path=../include/relative.include file:.git/../include/relative.include user.relative=include command line: user.cmdline=true 

Para um cenário, como comentado por wisbucky :

 git config --show-origin --get-all core.autocrlf file:"D:\\prgs\\git\\latest\\mingw64/etc/gitconfig" true file:C:/Users/vonc/.gitconfig false 

Depois de ter instalado o Git para Windows e depois desinstalá-lo, descobri que há um arquivo de configuração instalado em C: \ Users \ All Users \ Git \ config, que é um arquivo de configuração no nível do sistema que persiste e afetará futuros pacotes mingw32 git (no meu caso, eu estava rodando um pacote mingw32 git portátil fornecido pela minha empresa). Quando eu corri

 git config --system --edit 

ele me mostraria o arquivo de configuração do sistema localizado em mingw32 / etc / gitconfig, mas ainda carregaria os valores do primeiro local também. Isso apareceu como um aviso de que os valores de configuração entraram em conflito ao tentar usar o git lfs

 WARNING: These git config values clash: git config "http.sslcainfo" = "C:/Users/foo/AppData/Local/Programs/Git/mingw64/ssl/certs/ca-bundle.crt" git config "http.sslcainfo" = "/ssl/certs/ca-bundle.crt" 

(Nota: esta também pode ser uma situação em que os avisos do lf estão sendo muito assertivos # 861 )

Git config -l mostra todos os valores herdados de: system, global e local.

Então você tem outro arquivo de configuração em algum lugar que está sendo carregado junto com o seu usuário definido .gitconfig

Se você quiser encontrar o local real do arquivo, ele estará no seu diretório pessoal.

Está oculto e precedido por um “.”.

Então, se você está em um Mac, no seu terminal você pode cd ~ && open .gitconfig ou abri-lo com o seu editor de texto favorito, por exemplo, cd ~ && atom .gitconfig .