Da dove provengono le impostazioni nella mia configurazione Git?


88

Ho notato che ho due elenchi per core.autocrlfquando corrogit 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

Questi ultimi tre (da user.name in basso) sono gli unici nel mio C:\users\username\.gitconfigfile. Da dove vengono tutti gli altri? Perché core.autocrlf è elencato due volte?

Questo è con MSysGit 1.8.3 e ho anche installato Sourcetree (Windows 7). In Sourcetree ho deselezionato "Consenti a Sourcetree di modificare i tuoi file di configurazione Git globali"


18
Nota: con git 2.8 (marzo 2016) e git config --list --show-origin, non dovrai indovinare quale git config è dove. Vedi la mia risposta di seguito
VonC

Risposte:


97

Git controlla quattro posizioni per un file di configurazione:

  1. Il .gitconfigfile di sistema della tua macchina .
  2. Il tuo .gitconfigfile utente si trova in ~/.gitconfig.
  3. Un secondo file di configurazione specifico dell'utente situato in $XDG_CONFIG_HOME/git/configo $HOME/.config/git/config.
  4. Il file di configurazione del repository locale .git/config.

Le impostazioni si sovrappongono nell'ordine seguente, con ogni file che aggiunge o sovrascrive le impostazioni definite nel file sopra di esso.

  1. Configurazione di sistema.
  2. Configurazione utente.
  3. Configurazione specifica del repository.

Puoi vedere cosa ha definito ogni file usando i seguenti comandi:

# 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

Puoi vedere cosa ha definito solo il file specifico del repository aprendo il file .git/configper quel repository.

Se stai usando MSysGit su Windows, probabilmente troverai il tuo ~/.gitconfigfile utente dove %homepath%punta se lo usi echo %homepath%da un prompt dei comandi di Windows.

Dalla documentazione pergit config :

Se non impostato esplicitamente con --file, ci sono quattro file in cui git configcercherà le opzioni di configurazione:

  • $(prefix)/etc/gitconfig

    File di configurazione a livello di sistema.

  • $XDG_CONFIG_HOME/git/config

Secondo file di configurazione specifico dell'utente. Se $XDG_CONFIG_HOMEnon è impostato o è vuoto, $HOME/.config/git/configverrà utilizzato. Qualsiasi variabile a valore singolo impostata in questo file verrà sovrascritta da ciò che è in ~/.gitconfig. È una buona idea non creare questo file se a volte usi versioni precedenti di Git, poiché il supporto per questo file è stato aggiunto abbastanza di recente.

  • ~/.gitconfig

File di configurazione specifico dell'utente. Chiamato anche file di configurazione "globale".

  • $GIT_DIR/config

    File di configurazione specifico del repository.

Se non vengono fornite ulteriori opzioni, tutte le opzioni di lettura leggeranno tutti questi file disponibili. Se il file di configurazione globale o di sistema non è disponibile, verranno ignorati. Se il file di configurazione del repository non è disponibile o leggibile, git configuscirà con un codice di errore diverso da zero. Tuttavia, in nessuno dei casi verrà emesso un messaggio di errore.

I file vengono letti nell'ordine indicato sopra, con l'ultimo valore trovato che ha la precedenza sui valori letti in precedenza. Quando vengono presi più valori, verranno utilizzati tutti i valori di una chiave da tutti i file.

Tutte le opzioni di scrittura scriveranno per impostazione predefinita nel file di configurazione specifico del repository. Nota che questo influisce anche su opzioni come --replace-alle --unset. git config cambierà solo un file alla volta.

È possibile sovrascrivere queste regole tramite opzioni della riga di comando o variabili di ambiente. Le --globale le --systemopzioni limiterà il file utilizzato per il file globale o livello di sistema, rispettivamente. La GIT_CONFIGvariabile d'ambiente ha un effetto simile, ma puoi specificare qualsiasi nome di file desideri.


3
Dov'è il " .gitconfigfile di sistema della macchina " su Windows con msysgit?
DanielSank

3
@DanielSank prova C:\Program Files (x86)\Git\etc\gitconfig. Non sono sicuro che sia quello giusto però.

@ Cupcake: Sì, è stato così. Per qualche motivo non posso modificare quel file però. Qualche processo si sta trattenendo ... non riesco a capire quale. Immagino che non sia importante poiché posso semplicemente sovrascrivere le configurazioni a livello utente. Grazie.
DanielSank

2
Letture Git attualiC:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth

1
@KevinSmyth questo è cambiato di recente inC:\Program Files\Git\etc\gitconfig
Enrice

63

Non devi più indovinare quale configurazione è stata impostata su dove, con git 2.8! (Marzo 2016)

Vedere commit 70bd879 , commit 473166b , commit 7454ee3 , commit 7454ee3 (19 febbraio 2016), commit 473166b , commit 7454ee3 (19 febbraio 2016), commit 7454ee3 (19 febbraio 2016) e commit a0578e0 (17 febbraio 2016) di Lars Schneider ( larsxschneider) .
(Fuso da Junio ​​C Hamano - gitster- in commit dd0f567 , 26 febbraio 2016)

config: aggiungi ' --show-origin' opzione per stampare l'origine di un valore di configurazione

Se i valori di configurazione vengono interrogati usando ' git config' (ad esempio via --get, --get-all, --get-regexp, o--list bandiera), allora è a volte difficile trovare il file di configurazione in cui sono stati definiti i valori.

Insegnare " git configl' --show-originopzione" per stampare il file di configurazione di origine per ogni valore stampato.

La git configpagina man ora indicherà:

--show-origin:

Aumenta l'output di tutte le opzioni di configurazione interrogate con il tipo di origine (file, input standard, blob, riga di comando) e l'origine effettiva (percorso del file di configurazione, ref o ID blob se applicabile).

Per esempio:

git config --list --show-origin

Quello tornerà:

    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

Per prima cosa, come commentato da wisbucky :

git config --show-origin --get-all core.autocrlf

    file:"D:\\prgs\\git\\latest\\mingw64/etc/gitconfig"     true
    file:C:/Users/vonc/.gitconfig   false

Con Git 2.26 (Q1 2020), puoi aggiungere l' --show-scopeopzione :

git config -l --show-origin --show-scope

1
Grazie Dio. Tanti articoli diversi online che indovinano dove potrebbero essere state archiviate le configurazioni git. Tutti gli articoli mancavano di una possibile posizione che era stata configurata sulla mia macchina: c: \ programdata \ git \ config. Non so perché sia ​​lì, ma sospetto l'integrazione TFS di Visual Studio. Gli altri luoghi strani che ho passato troppo tempo a cercare sono stati: C: \ program files \ mingw64 \ etc \ .gitconfig e H: \. Gitconfig. Grazie a Dio per questo nuovo comando. Gesù. Cristo.
RMuesi

Mi chiedo perché user.cmdline=trueè necessario per --show-originfunzionare? Inoltre, ho notato che --show-origindeve essere immediatamente successivo configper poter lavorare con --gete --get-all. Così dovrebbe essere... config --show-origin --get-all core.autocrlf
wisbucky

@wisbucky d'accordo: rimuovo il -c 'user.cmdline=true'bit, che sembra riferirsi all'ambito del test: github.com/git/git/blob/…
VonC

@wisbucky E ho incluso il tuo esempio per un'impostazione.
VonC

@VonC, Ah sembra che user.cmdline=truefosse necessario in Git 2.13, ma non più necessario in Git 2.15.
wisbucky

10

Dopo aver precedentemente installato Git per Windows e successivamente disinstallato, ho scoperto che è installato un file di configurazione in C:\Users\All Users\Git\configcui è un file di configurazione a livello di sistema che persiste e influenzerà tutti i futuri pacchetti MinGW32 Git (nel mio caso, stavo eseguendo un MinGW32 portatile Pacchetto Git fornito dalla mia azienda). Quando ho corso

git config --system --edit

mi mostrerebbe il file di configurazione del sistema che si trova in mingw32/etc/gitconfig, ma carica comunque i valori anche dalla prima posizione. Questo è apparso come un avviso che i valori di configurazione si sono scontrati durante il tentativo di utilizzare 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: questa potrebbe anche essere una situazione in cui gli avvisi di LFS sono troppo assertivi, # 861 )


Questo è molto utile. Non avrei mai trovato quel file in Tutti gli utenti. Cosa ne hai fatto?
T3rm1

1
Ho rimosso le cartelle "Git" da C: \ Users \ All Users \ (un alias di C: \ ProgramData) e C: \ Users \ foo \ AppData \ Local \ Programs \ che rimuovevano tutti i file di configurazione rimasti.
jinxcat2008

3

Puoi usare --show-origin per scoprire da dove provengono le configurazioni.

Priorità dei file di configurazione in Git per Windows:

...

$PROGRAMDATA/Git/config::
(solo Windows) File di configurazione a livello di sistema condiviso con altre implementazioni Git. In genere $PROGRAMDATA punta aC:\ProgramData .

$(prefix)/etc/gitconfig::
File di configurazione a livello di sistema. (Solo per Windows) Questo file contiene solo le impostazioni specifiche per questa installazione di Git per Windows e che non dovrebbero essere condivise con altre implementazioni di Git come JGit, libgit2. --systemselezionerà questo file.

$XDG_CONFIG_HOME/git/config::
Secondo file di configurazione specifico per l'utente. Se $XDG_CONFIG_HOMEnon è impostato o è vuoto, $HOME/.config/git/configverrà utilizzato. Qualsiasi variabile a valore singolo impostata in questo file verrà sovrascritta da ciò che è in ~/.gitconfig. È una buona idea non creare questo file se a volte usi versioni precedenti di Git, poiché il supporto per questo file è stato aggiunto abbastanza di recente.

~/.gitconfig::
File di configurazione specifico dell'utente. Chiamato anche file di configurazione "globale".

$GIT_DIR/config::
File di configurazione specifico del repository.

...

I file vengono letti nell'ordine indicato sopra, con l'ultimo valore trovato che ha la precedenza sui valori letti in precedenza.

...

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

$PROGRAMDATAè una variabile d'ambiente. Puoi ottenere il valore di quelle variabili in questo modo:

In Git Bash devi usare echo "$ProgramData". In CMD, è necessario utilizzare echo %PROGRAMDATA%. Si noti che Git Bash apparentemente finge che le variabili d'ambiente siano case sensitive.

Che cos'è $(prefix)?

Il prefisso è la directory di primo livello in cui vengono installati gli elementi. In Git per Windows, è <some-path>/mingw64o <some-path>/mingw32.


3

git config -l mostra tutti i valori ereditati da system, global e local.

Quindi hai un altro file di configurazione da qualche parte che viene caricato insieme al tuo .gitconfigfile definito dall'utente .


Grazie, la tua risposta mi ha fatto capire la differenza tra sistema e globale. La risposta di @ Cupcake con i flag --system mi ha aiutato a trovare il file.
RyanW

2

Una risposta completa per Windows (ovvero una versione Windows della risposta accettata):

Come Linux, Windows ha quattro livelli di file di configurazione / impostazioni e tre sono equivalenti diretti. La cosa importante da notare è l'altra, quella "Tutte le app / gli utenti", soprattutto perché è qui che il programma di installazione imposta i valori, ad esempio "core.autocrlf = true", e tuttavia non è possibile accedervi dalla riga di comando quindi provoca confusione.

Tutte le applicazioni e gli utenti

È come una versione condivisa delle impostazioni di "sistema" nel caso in cui siano installate più applicazioni Git. Non esiste un comando "git config" per accedervi, ma hanno comunque un impatto sul risultato netto per un'impostazione.

Posizione del file di configurazione:

C: \ ProgramData \ Git \ config

(Tieni presente che "ProgramData" era "Tutti gli utenti" nelle versioni precedenti di Windows.)

Sistema

Posizione del file di configurazione: C: / Programmi / Git / mingw64 / etc / gitconfig

$ git config --system --list

Utente

Posizione del file di configurazione:% USERPROFILE% .gitconfig (questo si risolve in 'C: / Users / <username>')

$ git config --global --list

Repository

Posizione del file di configurazione: [directory del repository corrente] /. Git / config

$ git config --local --list

2

Inoltre git config -l --show-origin, quello che ho presentato qui , con git 2.8 (marzo 2016), ora hai, con Git 2.26 (Q1 2020)

git config -l --show-scope

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

git configimparato a mostrare in quale " scope", oltre a in quale file, proviene ogni impostazione di configurazione.

Vedere commit 145d59f , commit 9a83d08 , commit e37efa4 , commit 5c105a8 , commit 6766e41 , commit 6dc905d , commit a5cb420 (10 febbraio 2020) e commit 417be08 , commit 3de7ee3 , commit 329e6ec (24 gennaio 2020) di Matthew Rogers ( ROGERSM94) .
(Fuso da Junio ​​C Hamano - gitster- nel commit 5d55554 , 17 febbraio 2020)

config: aggiungi '--show-scope' per stampare l'ambito di un valore di configurazione

Firmato da: Matthew Rogers

Quando un utente esegue una query sui valori di configurazione --show-origin, spesso è difficile determinare quale sia l'effettivo " scope" ( local,global , ecc) di un dato valore si basa sul solo il file di origine.

Insegna a 'git config' l' --show-scopeopzione ' ' per stampare l'ambito di tutti i valori di configurazione visualizzati.

Nota che non dovremmo mai vedere nulla di ambito "sottomodulo" in quanto viene utilizzato solo da submodule-config.cquando analizza il file ".gitmodules".

Esempio:

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

1

Su Windows 7 (forse lo stesso o simile per Windows 10), per Visual Studio e la riga di comando Git, la tua configurazione globale è in:

%USERPROFILE%\.gitconfig

(il punto è davanti al nome del file)

Ma questo non è onorato da Sourcetree, almeno in modalità Git Embedded, e la configurazione è in:

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

(nessun punto davanti al nome del file)

(Avevo bisogno di aggiornare entrambi i file per modificare le mie impostazioni Git globali per il comando Git e Sourcetree.)

Un'altra parte divertente. La configurazione degli hook di Git funzionava dalla AppData\Local\...posizione, ma dopo ulteriori ricerche tramite Process Monitor , ho notato che in qualche modo Sourcetree sta caricando anche globale dall'unità mappata dell'azienda per il mio utente.

Questo non ha molto senso poiché pochissime applicazioni cercano questa posizione, ma in qualche modo Sourcetree lo fa, quindi se non riesci a farlo funzionare in base alle impostazioni della posizione su Sourcetree, esegui Process Monitor e crea una regola per registrare solo il percorso contenente gitconfig, e tu può trovare dove si trova realmente la tua configurazione globale nel caso di una directory utente mappata in rete.

E questo potrebbe non essere nemmeno colpa di Sourcetree, come vedo ora mentre scrivo che git.exe lo sta caricando, ma questo accade solo per git.exe eseguito da Sourcetree, mentre una riga di comando diretta Git utilizza %USERPROFILE%\.gitconfig

Inserisci qui la descrizione dell'immagine

Alla fine ho preso tutti i risultati da Process Monitor, li ho inseriti in SQL Server ed ho eseguito una query per ottenere risultati distinti (nessun particolare ordine di esecuzione ordinato solo per percorso):

Inserisci qui la descrizione dell'immagine

Non so come queste configurazioni si relazionano tra loro, ma so che alcune sovrascrivono un altro, alcune impostazioni funzionano da una posizione e altre.

E l'elenco sopra viene richiamato da Sourcetree , di nuovo una riga di comando diretta con Git sembra funzionare bene %USERPROFILE%\.gitconfig, e non è in questo elenco, ma sarebbe simile a questo (su Windows 7)C:\Users\pawel.cioch\.gitconfig


-1

Se vuoi trovare per trovare l'effettiva posizione del file, sarà nella tua directory home.

È nascosto e preceduto da un ".".

Quindi, se sei su un Mac, nel tuo terminale puoi cd ~ && open .gitconfigo aprirlo con il tuo editor di testo preferito, ad es cd ~ && atom .gitconfig.


1
Questo è già stato detto. Non c'è bisogno di aggiungere confusione suggerendo un'alternativa (non).
Stim
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.