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

87

Percebi que tenho duas listas para core.autocrlfquando executogit 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
[email protected]
core.autocrlf=true

Esses três últimos (de user.name para baixo) são os únicos em meu C:\users\username\.gitconfigarquivo. De onde estão vindo todos os outros? Por que core.autocrlf está listado duas vezes?

Isso é com MSysGit 1.8.3, e também tenho Sourcetree instalado (Windows 7). No Sourcetree, desmarquei a opção "Permitir que o Sourcetree modifique seus arquivos de configuração Git globais"

RyanW
fonte
17
Nota: com git 2.8 (março de 2016) e git config --list --show-origin, você não terá que adivinhar qual configuração git está onde. Veja minha resposta abaixo
VonC

Respostas:

97

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

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

As configurações se propagam na seguinte ordem, com cada arquivo adicionando ou substituindo as configurações definidas no arquivo acima dele.

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

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 repositório definiu abrindo o arquivo .git/configpara esse repositório.

Se você estiver usando o MSysGit no Windows, provavelmente encontrará seu ~/.gitconfigarquivo de usuário onde %homepath%quer que aponte, se usar a echo %homepath%partir de um prompt de comando do Windows.

Da documentação paragit config :

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

  • $(prefix)/etc/gitconfig

    Arquivo de configuração de todo o sistema.

  • $XDG_CONFIG_HOME/git/config

Segundo arquivo de configuração específico do usuário. Se $XDG_CONFIG_HOMEnão estiver definido ou vazio, $HOME/.config/git/configserá usado. Qualquer variável de valor único definida neste arquivo será substituída por tudo o 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 este 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 repositório.

Se nenhuma outra opção for fornecida, todas as opções de leitura irão ler todos os arquivos que estão disponíveis. Se o arquivo de configuração global ou de todo o sistema não estiver disponível, eles serão ignorados. Se o arquivo de configuração do repositório não estiver disponível ou legível, git configserá encerrado 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 fornecida 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 gravação serão gravadas por padrão no arquivo de configuração específico do repositório. Observe que isso também afeta opções como --replace-alle --unset. git config mudará apenas um arquivo por vez.

Você pode substituir essas regras por opções de linha de comando ou por variáveis ​​de ambiente. Os --globale as --systemopções irá limitar o arquivo usado para o arquivo global ou de todo o sistema, respectivamente. A GIT_CONFIGvariável de ambiente tem um efeito semelhante, mas você pode especificar qualquer nome de arquivo que desejar.

Peter Mortensen
fonte
3
Onde está o " .gitconfigarquivo de sistema da máquina " no Windows com msysgit?
DanielSank
3
@DanielSank try C:\Program Files (x86)\Git\etc\gitconfig. Não tenho certeza se esse é o certo.
@Cupcake: Sim, era isso. Por algum motivo, não posso modificar esse arquivo. Algum processo está se segurando ... não consigo descobrir qual. Eu acho que não importa, já que posso apenas substituir nas configurações de nível de usuário. Obrigado.
DanielSank
2
Leituras atuais do GitC:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth
1
@KevinSmyth isso mudou recentemente paraC:\Program Files\Git\etc\gitconfig
Enrice
62

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

Consulte commit 70 relevant79 , commit 473166b , commit 7454ee3 , commit 7454ee3 (19 de fevereiro de 2016), commit 473166b , commit 7454ee3 (19 de fevereiro de 2016), commit 7454ee3 (19 de fevereiro de 2016) e commit a0578e0 (17 de fevereiro de 2016) por Lars Schneider ( larsxschneider) .
(Fundido por Junio ​​C Hamano - gitster- no commit dd0f567 , 26 de fevereiro de 2016)

config: adicione a --show-originopção ' ' para imprimir a origem de um valor de configuração

Se os valores de configuração são consultados usando ' git config' (por exemplo, através --get, --get-all, --get-regexp, ou --listbandeira), então às vezes é difícil encontrar o arquivo de configuração onde os valores foram definidos.

Ensine git configa --show-originopção ' ' a ' ' para imprimir o arquivo de configuração de origem para cada valor impresso.

A git configpágina do manual agora indica:

--show-origin:

Aumente a saída de todas as opções de configuração consultadas com o tipo de origem (arquivo, entrada 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 vai 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 uma configuração, conforme 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

Com Git 2.26 (Q1 2020), você pode adicionar a --show-scopeopção :

git config -l --show-origin --show-scope
VonC
fonte
1
graças a Deus. Tantos artigos diferentes online adivinhando onde as configurações do git podem ter sido armazenadas. Todos os artigos perderam um local possível que por acaso foi configurado na minha máquina: c: \ programdata \ git \ config. Não sei por que está lá, mas eu suspeito da integração TFS do Visual Studio. Os outros locais estranhos que gastei muito tempo procurando foram: C: \ arquivos de programas \ mingw64 \ etc \ .gitconfig e H: \. Gitconfig. Graças a Deus por este novo comando. Jesus. Cristo.
RMuesi de
Eu me pergunto por que user.cmdline=trueé necessário para --show-origintrabalhar? Além disso, notei que --show-originprecisa ser imediatamente depois configpara trabalhar com --gete --get-all. Assim deveria ser... config --show-origin --get-all core.autocrlf
wisbucky de
@wisbucky Concordado: eu removo a parte -c 'user.cmdline=true', que parece se referir ao escopo do teste: github.com/git/git/blob/…
VonC
@wisbucky E eu incluí seu exemplo para uma configuração.
VonC de
@VonC, Ah parece que user.cmdline=trueera necessário no Git 2.13, mas não era mais necessário no Git 2.15.
wisbucky de
10

Depois de ter instalado o Git para Windows anteriormente e, subsequentemente, desinstalá-lo, descobri que há um arquivo de configuração instalado no C:\Users\All Users\Git\configqual é um arquivo de configuração de nível de sistema que persiste e afetará quaisquer pacotes MinGW32 Git futuros (no meu caso, eu estava executando um MinGW32 portátil Pacote Git 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"

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

jinxcat2008
fonte
Isso é muito útil. Nunca teria encontrado esse arquivo em Todos os usuários. O que você fez com isso?
T3rm1
1
Removi as pastas 'Git' de C: \ Users \ All Users \ (um alias para C: \ ProgramData) e C: \ Users \ foo \ AppData \ Local \ Programs \ que removeu todos os arquivos de configuração restantes.
jinxcat2008
3

Você pode usar --show-originpara descobrir de onde vêm as configurações.

Prioridade dos arquivos de configuração no Git para Windows:

...

$PROGRAMDATA/Git/config::
(somente Windows) Arquivo de configuração de todo o sistema compartilhado com outras implementações Git. Normalmente $PROGRAMDATA aponta para C:\ProgramData.

$(prefix)/etc/gitconfig::
Arquivo de configuração de todo o sistema. (Somente Windows) Este arquivo contém apenas as configurações que são específicas para esta instalação do Git para Windows e que não devem ser compartilhadas com outras implementações do Git como JGit, libgit2. --systemirá selecionar este arquivo.

$XDG_CONFIG_HOME/git/config::
Segundo arquivo de configuração específico do usuário. Se $XDG_CONFIG_HOMEnão estiver definido ou vazio, $HOME/.config/git/configserá usado. Qualquer variável de valor único definida neste arquivo será substituída por tudo o 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 este 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 repositório.

...

Os arquivos são lidos na ordem fornecida acima, com o último valor encontrado tendo precedência sobre os valores lidos anteriormente.

...

Fonte: https://github.com/git-for-windows/git/blob/master@%7B2018-01-07%7D/Documentation/git-config.txt#L231

$PROGRAMDATAé uma variável de ambiente. Você pode obter o valor dessas variáveis ​​como este:

No Git Bash você precisa usar echo "$ProgramData". No CMD, você precisa usar echo %PROGRAMDATA%. Observe que o Git Bash aparentemente finge que as variáveis ​​de ambiente diferenciam maiúsculas de minúsculas.

O que é $(prefix)?

O prefixo é o diretório de nível superior no qual as coisas são instaladas. No Git para Windows, é <some-path>/mingw64ou <some-path>/mingw32.

Ini
fonte
3

git config -l mostra todos os valores herdados do sistema, global e local.

Portanto, você tem outro arquivo de configuração em algum lugar que está sendo carregado junto com o .gitconfigarquivo definido pelo usuário .

CBIII
fonte
Obrigado, sua resposta me mostrou a diferença entre sistema e global. A resposta do @ Cupcake com as sinalizações --system me ajudou a encontrar o arquivo.
RyanW
2

Uma resposta completa para Windows (ou seja, uma versão Windows da resposta aceita):

Como o Linux, o Windows tem quatro níveis de arquivos de configuração / configurações e três são equivalentes diretos. O importante a notar é o outro - o 'Todos os aplicativos / usuários' - particularmente porque é aqui que o instalador define valores, por exemplo, 'core.autocrlf = true', e ainda não pode ser acessado a partir da linha de comando por isso causa confusão.

Todos os aplicativos e usuários

É como uma versão compartilhada das configurações do 'sistema' no caso de você ter vários aplicativos Git instalados. Não há comando 'git config' para acessá-los, mas eles ainda impactam o resultado líquido de uma configuração.

Localização do arquivo de configuração:

C: \ ProgramData \ Git \ config

(Observe que 'ProgramData' era 'Todos os usuários' em versões anteriores do Windows.)

Sistema

Localização do arquivo de configuração: C: / Arquivos de programas / Git / mingw64 / etc / gitconfig

$ git config --system --list

Do utilizador

Localização do arquivo de configuração:% USERPROFILE% .gitconfig (resolve para 'C: / Usuários / <nome de usuário>')

$ git config --global --list

Repositório

Localização do arquivo de configuração: [diretório do repositório atual] /. Git / config

$ git config --local --list
Tom
fonte
2

Além do git config -l --show-originque apresentei aqui , com o git 2.8 (março de 2016), agora você tem, com o Git 2.26 (primeiro trimestre de 2020)

git config -l --show-scope

# you can combine both options:
git config -l --show-origin --show-scope

git configaprendi a mostrar de que " scope", além de em qual arquivo, cada configuração vem.

Ver commit 145d59f , commit 9a83d08 , commit e37efa4 , commit 5c105a8 , commit 6766e41 , commit 6dc905d , commit a5cb420 (10 de fevereiro de 2020) e commit 417be08 , commit 3de7ee3 , commit 329e6ec (24 janeiro 2020) por Matthew Rogers ( ROGERSM94) .
(Fundido por Junio ​​C Hamano - gitster- no commit 5d55554 , 17 de fevereiro de 2020)

config: adicione '--show-scope' para imprimir o escopo de um valor de configuração

Assinado por: Matthew Rogers

Quando um usuário consultas config-valores com --show-origin, muitas vezes é difícil determinar qual é o real " scope" ( local, global, etc.) de um determinado valor é baseado apenas o arquivo origem.

Ensine a opção 'git config' --show-scopepara imprimir o escopo de todos os valores de configuração exibidos.

Observe que nunca devemos ver nada do escopo de "submódulo", já que ele só é usado submodule-config.cao analisar o arquivo '.gitmodules'.

Exemplo:

git config -l --show-scope

global  user.global=true
global  user.override=global
global  include.path=$INCLUDE_DIR/absolute.include
global  user.absolute=include
local   user.local=true
local   user.override=local
local   include.path=../include/relative.include
local   user.relative=include
VonC
fonte
1

No Windows 7 (talvez o mesmo ou semelhante para o Windows 10), para Visual Studio e a linha de comando Git, sua configuração global está em:

%USERPROFILE%\.gitconfig

(o ponto está na frente do nome do arquivo)

Mas isso não é honrado pelo Sourcetree, pelo menos no modo Git Embedded, e a configuração está em:

%USERPROFILE%\AppData\Local\Atlassian\SourceTree\git_local\mingw32\etc\gitconfig

(nenhum ponto na frente do nome do arquivo)

(Eu precisava atualizar os dois arquivos para modificar minhas configurações globais do Git para o comando Git e Sourcetree.)

Outra parte divertida. A configuração de ganchos Git estava funcionando a partir do AppData\Local\...local, mas depois de mais pesquisas via Process Monitor , percebi que de alguma forma Sourcetree também está carregando global da unidade mapeada da empresa para o meu usuário.

Isso faz muito pouco sentido, pois poucos aplicativos procuram este local, mas de alguma forma o Sourcetree o faz, então se você não conseguir fazer com que funcione por configurações de local no Sourcetree, execute o Process Monitor e crie uma regra para registrar apenas o caminho contendo gitconfig pode descobrir onde realmente está sua configuração global no caso de um diretório de usuário mapeado em rede.

E isso pode não ser nem culpa do Sourcetree, pois vejo agora, enquanto escrevo isto, que o git.exe está carregando isso, mas isso acontece apenas para o git.exe executado pelo Sourcetree, enquanto uma linha de comando direta que o Git usa %USERPROFILE%\.gitconfig

Insira a descrição da imagem aqui

Por fim, peguei todos os resultados do Process Monitor, coloquei no SQL Server e executei uma consulta para obter resultados distintos (nenhuma ordem de execução específica, apenas classificada por caminho):

Insira a descrição da imagem aqui

Não sei como essas configurações se relacionam entre si, mas sei que algumas substituem outras, algumas configurações funcionam de um local e outras funcionam de outro.

E a lista acima é invocada pelo Sourcetree , novamente uma linha de comando direta com Git parece funcionar bem %USERPROFILE%\.gitconfig, e isso não está nesta lista, mas seria assim (no Windows 7)C:\Users\pawel.cioch\.gitconfig

Pawel Cioch
fonte
-1

Se você deseja localizar o local real do arquivo, ele estará no seu diretório inicial.

Está oculto e precedido por um ".".

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

AshNaz87
fonte
1
Isso já foi dito. Não há necessidade de aumentar a confusão sugerindo uma (não) alternativa.
Stim