Skąd pochodzą ustawienia w mojej konfiguracji Git?

87

Zauważyłem, że mam dwie oferty, core.autocrlfkiedy biegamgit 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

Te ostatnie trzy (od user.name w dół) są jedynymi w moim C:\users\username\.gitconfigpliku. Skąd pochodzą wszystkie inne? Dlaczego plik core.autocrlf jest wymieniony dwukrotnie?

Dotyczy to MSysGit 1.8.3, mam też zainstalowane oprogramowanie Sourcetree (Windows 7). W Sourcetree odznaczyłem opcję „Zezwalaj Sourcetree na modyfikowanie globalnych plików konfiguracyjnych Git”

RyanW
źródło
17
Uwaga: z git 2.8 (marzec 2016) i git config --list --show-originnie będziesz musiał zgadywać, która konfiguracja git jest gdzie. Zobacz moją odpowiedź poniżej
VonC,

Odpowiedzi:

97

Git sprawdza cztery miejsca dla pliku konfiguracyjnego:

  1. .gitconfigPlik systemowy twojego komputera .
  2. Twój .gitconfigplik użytkownika znajduje się pod adresem ~/.gitconfig.
  3. Drugi plik konfiguracyjny specyficzny dla użytkownika znajdujący się pod adresem $XDG_CONFIG_HOME/git/configlub $HOME/.config/git/config.
  4. Plik konfiguracyjny repozytorium lokalnego .git/config.

Ustawienia są kaskadowe w następującej kolejności, a każdy plik dodaje lub zastępuje ustawienia zdefiniowane w pliku nad nim.

  1. Konfiguracja systemu.
  2. Konfiguracja użytkownika.
  3. Konfiguracja specyficzna dla repozytorium.

Możesz zobaczyć, co zdefiniowano w każdym pliku, używając następujących poleceń:

# 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

Możesz zobaczyć, co zdefiniował tylko plik specyficzny .git/configdla repozytorium, otwierając plik dla tego repozytorium.

Jeśli używasz MSysGit w systemie Windows, prawdopodobnie znajdziesz swój ~/.gitconfigplik użytkownika wszędzie tam, gdzie %homepath%wskazuje, jeśli używasz echo %homepath%z wiersza poleceń systemu Windows.

Z dokumentacji dlagit config :

Jeśli nie zostanie ustawione jawnie z --file, istnieją cztery pliki, w których git configbędą szukać opcji konfiguracyjnych:

  • $(prefix)/etc/gitconfig

    Plik konfiguracyjny dla całego systemu.

  • $XDG_CONFIG_HOME/git/config

Drugi plik konfiguracyjny specyficzny dla użytkownika. Jeśli $XDG_CONFIG_HOMEnie jest ustawiona lub pusta, $HOME/.config/git/configzostanie użyta. Każda zmienna jednowartościowa ustawiona w tym pliku zostanie nadpisana przez zawartość ~/.gitconfig. Dobrze jest nie tworzyć tego pliku, jeśli czasami używasz starszych wersji Gita, ponieważ obsługa tego pliku została dodana dość niedawno.

  • ~/.gitconfig

Plik konfiguracyjny specyficzny dla użytkownika. Nazywany także „globalnym” plikiem konfiguracyjnym.

  • $GIT_DIR/config

    Plik konfiguracyjny specyficzny dla repozytorium.

Jeśli nie podano dalszych opcji, wszystkie opcje odczytu odczytują wszystkie dostępne pliki. Jeśli globalny lub ogólnosystemowy plik konfiguracyjny nie jest dostępny, zostaną zignorowane. Jeśli plik konfiguracyjny repozytorium nie jest dostępny lub czytelny, git configzakończy pracę z niezerowym kodem błędu. Jednak w żadnym przypadku nie zostanie wyświetlony komunikat o błędzie.

Pliki są odczytywane w kolejności podanej powyżej, przy czym ostatnia znaleziona wartość ma pierwszeństwo przed wartościami odczytanymi wcześniej. Gdy zostanie pobranych wiele wartości, zostaną użyte wszystkie wartości klucza ze wszystkich plików.

Wszystkie opcje zapisu będą domyślnie zapisywać w pliku konfiguracyjnym specyficznym dla repozytorium. Zauważ, że wpływa to również na opcje takie jak --replace-alli --unset. git config zmieni tylko jeden plik na raz.

Te reguły można przesłonić za pomocą opcji wiersza polecenia lub zmiennych środowiskowych. Te --globali --systemopcje będą ograniczać plik używany do globalnego lub całego systemu plików odpowiednio. GIT_CONFIGZmienna ma podobny efekt, ale można podać dowolną nazwę pliku, który chcesz.

Peter Mortensen
źródło
3
Gdzie jest „ .gitconfigplik systemowy maszyny ” w systemie Windows z msysgit?
DanielSank
3
@DanielSank spróbuj C:\Program Files (x86)\Git\etc\gitconfig. Nie jestem pewien, czy to właściwy.
@Cupcake: Tak, to było to. Z jakiegoś powodu nie mogę jednak modyfikować tego pliku. Jakiś proces się go trzyma ... nie mogę dowiedzieć się, który z nich. Myślę, że to nie ma znaczenia, ponieważ mogę po prostu zastąpić konfiguracje na poziomie użytkownika. Dzięki.
DanielSank
2
Aktualny odczyt GitaC:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth
1
@KevinSmyth Ostatnio zmieniło się to naC:\Program Files\Git\etc\gitconfig
Enrice
62

Nie musisz już zgadywać, która konfiguracja została ustawiona na gdzie, dzięki git 2.8! (Marzec 2016)

Zobacz zatwierdzenie 70bd879 , zatwierdzenie 473166b , zatwierdzenie 7454ee3 , zatwierdzenie 7454ee3 (19 lutego 2016 r.), Zatwierdzenie 473166b , zatwierdzenie 7454ee3 (19 lutego 2016 r.), Zatwierdzenie 7454ee3 (19 lutego 2016 r.) I zatwierdzenie a0578e0 (17 lutego 2016 r.) Autorstwa Larsa Schneidera ( larsxschneider) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu dd0f567 , 26 lutego 2016 r.)

config: dodaj --show-originopcję „ ”, aby wydrukować pochodzenie wartości konfiguracyjnej

Jeśli wartości konfiguracyjne są testowane za pomocą „ git config” (np za pomocą --get, --get-all, --get-regexplub --listflag) to jest czasami trudno znaleźć plik konfiguracyjny gdzie zostały określone wartości.

Naucz opcję ' git config' the ' --show-origin', aby wydrukować źródłowy plik konfiguracyjny dla każdej drukowanej wartości.

Strona git configpodręcznika będzie teraz wskazywać:

--show-origin:

Rozszerz dane wyjściowe wszystkich odpytywanych opcji konfiguracji o typ źródła (plik, standardowe wejście, obiekt blob, wiersz polecenia) i rzeczywiste pochodzenie (ścieżka pliku konfiguracyjnego, ref lub identyfikator obiektu BLOB, jeśli dotyczy).

Na przykład:

git config --list --show-origin

To wróci:

    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

Na jednym ustawieniu, jak skomentował przez wisbucky :

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

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

W Git 2.26 (Q1 2020) możesz dodać --show-scopeopcję :

git config -l --show-origin --show-scope
VonC
źródło
1
dzięki Bogu. Tak wiele różnych artykułów online zgadujących, gdzie mogły zostać zapisane konfiguracje git. We wszystkich artykułach brakowało jednej możliwej lokalizacji, która została skonfigurowana na moim komputerze: c: \ programdata \ git \ config. Nie wiem, dlaczego tam jest, ale podejrzewam integrację Visual Studio z TFS. Inne dziwne lokalizacje, na które spędzam zbyt dużo czasu, to: C: \ program files \ mingw64 \ etc \ .gitconfig i H: \. Gitconfig. Dzięki Bogu za to nowe polecenie. Jezus. Chrystus.
RMuesi
Zastanawiam się, dlaczego user.cmdline=truejest to wymagane --show-origindo pracy? Zauważyłem też, że --show-originmusi to nastąpić natychmiast po, configaby móc pracować z --geti --get-all. Tak powinno być... config --show-origin --get-all core.autocrlf
wisbucky
@wisbucky Zgoda: usuwam -c 'user.cmdline=true'bit, który wydaje się odnosić do zakresu testowego: github.com/git/git/blob/ ...
VonC
@wisbucky I dołączyłem twój przykład dla jednego ustawienia.
VonC
@VonC, Ah wydaje się być user.cmdline=truekonieczne w Git 2.13, ale nie jest już potrzebne w Git 2.15.
wisbucky
10

Po wcześniejszym zainstalowaniu Git dla Windows, a następnie odinstalowaniu go, stwierdziłem, że jest zainstalowany plik konfiguracyjny, w C:\Users\All Users\Git\configktórym jest plik konfiguracyjny na poziomie systemu, który utrzymuje się i będzie wpływał na przyszłe pakiety MinGW32 Git (w moim przypadku korzystałem z przenośnego MinGW32 Pakiet Git dostarczony przez moją firmę). Kiedy biegałem

git config --system --edit

pokazałby mi plik konfiguracyjny systemu znajdujący się pod adresem mingw32/etc/gitconfig, ale nadal ładowałby wartości z pierwszej lokalizacji. Pojawiło się to jako ostrzeżenie, że wartości konfiguracyjne kolidowały podczas próby użycia 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"

(Uwaga: może to być również sytuacja, w której ostrzeżenia LFS są zbyt asertywne, # 861 )

jinxcat2008
źródło
To jest bardzo przydatne. Nigdy nie znalazłbym tego pliku w All Users. Co z tym zrobiłeś?
T3rm1
1
Usunąłem foldery „Git” z C: \ Users \ All Users \ (alias do C: \ ProgramData) i C: \ Users \ foo \ AppData \ Local \ Programs \, które usunęły wszystkie pozostałe pliki konfiguracyjne.
jinxcat2008,
3

Możesz użyć --show-origin, aby dowiedzieć się, skąd pochodzą konfiguracje.

Priorytet plików konfiguracyjnych w Git dla Windows:

...

$PROGRAMDATA/Git/config::
(tylko Windows) Ogólnosystemowy plik konfiguracyjny współdzielony z innymi implementacjami Git. Zazwyczaj $PROGRAMDATA wskazuje na C:\ProgramData.

$(prefix)/etc/gitconfig::
Plik konfiguracyjny dla całego systemu. (Tylko Windows) Ten plik zawiera tylko ustawienia, które są specyficzne dla tej instalacji Git dla Windows i które nie powinny być współużytkowane z innymi implementacjami Git, takimi jak JGit, libgit2. --systemwybierze ten plik.

$XDG_CONFIG_HOME/git/config::
Drugi plik konfiguracyjny specyficzny dla użytkownika. Jeśli $XDG_CONFIG_HOMEnie jest ustawiona lub pusta, $HOME/.config/git/configzostanie użyta. Każda zmienna jednowartościowa ustawiona w tym pliku zostanie nadpisana przez zawartość ~/.gitconfig. Dobrze jest nie tworzyć tego pliku, jeśli czasami używasz starszych wersji Gita, ponieważ obsługa tego pliku została dodana dość niedawno.

~/.gitconfig::
Plik konfiguracyjny specyficzny dla użytkownika. Nazywany także „globalnym” plikiem konfiguracyjnym.

$GIT_DIR/config::
Plik konfiguracyjny specyficzny dla repozytorium.

...

Pliki są odczytywane w kolejności podanej powyżej, przy czym ostatnia znaleziona wartość ma pierwszeństwo przed wartościami odczytanymi wcześniej.

...

Źródło: https://github.com/git-for-windows/git/blob/master@%7B2018-01-07%7D/Documentation/git-config.txt#L231

$PROGRAMDATAjest zmienną środowiskową. Możesz uzyskać wartość tych zmiennych w następujący sposób:

W Git Bash musisz użyć echo "$ProgramData". W CMD musisz użyć echo %PROGRAMDATA%. Zauważ, że Git Bash najwyraźniej udaje, że zmienne środowiskowe uwzględniają wielkość liter.

Co to jest $(prefix)?

Prefiks to katalog najwyższego poziomu, w którym instalowane są rzeczy. W Git dla Windows jest to albo <some-path>/mingw64albo <some-path>/mingw32.

Ini
źródło
3

git config -l pokazuje wszystkie wartości odziedziczone z systemu, globalne i lokalne.

Więc masz gdzieś inny plik konfiguracyjny, który jest ładowany wraz z .gitconfigplikiem zdefiniowanym przez użytkownika.

CBIII
źródło
Dziękuję, Twoja odpowiedź wskazała mi różnicę między systemem i globalnym. Odpowiedź @ Cupcake z flagami --system pomogła mi jednak znaleźć plik.
RyanW
2

Pełna odpowiedź dla systemu Windows (tj. Wersja zaakceptowanej odpowiedzi dla systemu Windows):

Podobnie jak Linux, Windows ma cztery poziomy plików / ustawień konfiguracyjnych, a trzy są bezpośrednimi odpowiednikami. Ważną rzeczą, na którą należy zwrócić uwagę, jest druga - „Wszystkie aplikacje / użytkownicy” - zwłaszcza, że ​​to tutaj instalator ustawia wartości, np. „Core.autocrlf = true”, a mimo to nie można uzyskać do niego dostępu z wiersza poleceń więc powoduje zamieszanie.

Wszystkie aplikacje i użytkownicy

Przypomina to udostępnioną wersję ustawień „systemowych” w przypadku, gdy masz zainstalowanych wiele aplikacji Git. Nie ma polecenia „git config”, aby uzyskać do nich dostęp, ale nadal mają one wpływ na wynik netto dla ustawienia.

Lokalizacja pliku konfiguracyjnego:

C: \ ProgramData \ Git \ config

(Zwróć uwagę, że „ProgramData” to „Wszyscy użytkownicy” w starszych wersjach systemu Windows).

System

Lokalizacja pliku konfiguracyjnego: C: / Program Files / Git / mingw64 / etc / gitconfig

$ git config --system --list

Użytkownik

Lokalizacja pliku konfiguracyjnego:% USERPROFILE% .gitconfig (jest to zastępowane jako „C: / Users / <nazwa użytkownika>”)

$ git config --global --list

Magazyn

Lokalizacja pliku konfiguracyjnego: [bieżący katalog repozytorium] /. Git / config

$ git config --local --list
Tomek
źródło
2

Oprócz tego git config -l --show-origin, co przedstawiłem tutaj , z gitem 2.8 (marzec 2016), masz teraz, z Git 2.26 (Q1 2020)

git config -l --show-scope

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

git confignauczyłem się pokazywać, w którym „ scope” oprócz którego pliku pochodzi każde ustawienie konfiguracyjne.

Zobacz commit 145d59f , commit 9a83d08 , commit e37efa4 , commit 5c105a8 , commit 6766e41 , commit 6dc905d , commit a5cb420 (10 lutego 2020) i commit 417be08 , commit 3de7ee3 , commit 329e6ec (24 stycznia 2020) Matthew Rogers ( ROGERSM94) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu 5d55554 , 17 lutego 2020 r.)

config: dodaj '--show-scope', aby wyświetlić zakres wartości konfiguracyjnej

Podpisał: Matthew Rogers

Gdy użytkownik zapytań config wartości z --show-origin, często trudno jest określić, co rzeczywiste „ scope” ( local, globaletc.) z danej wartości opiera się tylko na pliku pochodzenia.

Naucz --show-scopeopcję „git config”, aby wydrukować zakres wszystkich wyświetlanych wartości konfiguracyjnych.

Zauważ, że nigdy nie powinniśmy widzieć niczego z zakresu „submodułu”, ponieważ jest on używany tylko submodule-config.cpodczas analizowania pliku „.gitmodules”.

Przykład:

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
źródło
1

W systemie Windows 7 (może takim samym lub podobnym dla systemu Windows 10), w przypadku programu Visual Studio i wiersza poleceń Git, Twoja globalna konfiguracja jest następująca:

%USERPROFILE%\.gitconfig

(kropka przed nazwą pliku)

Ale to nie jest honorowane przez Sourcetree, przynajmniej w trybie Git Embedded, a konfiguracja jest następująca:

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

(brak kropki przed nazwą pliku)

(Musiałem zaktualizować oba pliki, aby zmodyfikować moje globalne ustawienia Git dla polecenia Git i Sourcetree.)

Kolejna fajna część. Konfiguracja hooków Git działała z AppData\Local\...lokalizacji, ale po dalszych badaniach za pośrednictwem Process Monitor zauważyłem, że Sourcetree w jakiś sposób ładuje również globalny dysk firmowy dla mojego użytkownika.

Ma to bardzo mało sensu, ponieważ bardzo niewiele aplikacji wyszukuje tę lokalizację, ale w jakiś sposób Sourcetree to robi, więc jeśli nie możesz zmusić go do pracy według ustawień lokalizacji w Sourcetree, uruchom Process Monitor i utwórz regułę, aby rejestrować tylko ścieżkę zawierającą gitconfig, a ty może znaleźć, gdzie naprawdę jest twoja globalna konfiguracja w przypadku katalogu użytkownika mapowanego na sieć.

I może to nie być nawet wina Sourcetree, ponieważ widzę teraz, pisząc to, że git.exe to ładuje, ale dzieje się tak tylko w przypadku git.exe wykonywanego przez Sourcetree, podczas gdy bezpośredni wiersz poleceń Git używa %USERPROFILE%\.gitconfig

Tutaj wprowadź opis obrazu

W końcu wziąłem wszystkie wyniki z Process Monitor, wrzuciłem je do SQL Server i uruchomiłem zapytanie, aby uzyskać różne wyniki (bez określonej kolejności wykonywania tylko posortowane według ścieżki):

Tutaj wprowadź opis obrazu

Nie wiem, jak te konfiguracje odnoszą się do siebie, ale wiem, że niektóre zastępują inne, niektóre ustawienia działają z jednej lokalizacji, a inne z drugiej.

Powyższa lista jest wywoływana przez Sourcetree , ponownie skieruj wiersz poleceń za pomocą Gita wydaje się działać dobrze %USERPROFILE%\.gitconfig, a tego nie ma na tej liście, ale wyglądałoby tak (w systemie Windows 7)C:\Users\pawel.cioch\.gitconfig

Paweł Cioch
źródło
-1

Jeśli chcesz znaleźć rzeczywistą lokalizację pliku, będzie to twój katalog domowy.

Jest ukryty i poprzedzony znakiem „.”.

Więc jeśli jesteś na Macu, w swoim terminalu możesz cd ~ && open .gitconfiglub otworzyć go za pomocą ulubionego edytora tekstu, np cd ~ && atom .gitconfig.

AshNaz87
źródło
1
To już zostało powiedziane. Nie ma potrzeby dodawania zamieszania, sugerując (nie) alternatywę.
Stim