Woher kommen die Einstellungen in meiner Git-Konfiguration?

87

Ich habe festgestellt, dass ich zwei Einträge habe, core.autocrlfwenn ich laufegit 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

Diese letzten drei (von user.name abwärts) sind die einzigen in meiner C:\users\username\.gitconfigDatei. Woher kommen all die anderen? Warum wird core.autocrlf zweimal aufgeführt?

Dies ist mit MSysGit 1.8.3 und ich habe auch Sourcetree installiert (Windows 7). In Sourcetree habe ich das Kontrollkästchen "Sourcetree erlauben, Ihre globalen Git-Konfigurationsdateien zu ändern" deaktiviert.

RyanW
quelle
17
Hinweis: Mit Git 2.8 (März 2016) und git config --list --show-originmüssen Sie nicht raten, welche Git-Konfiguration wo ist. Siehe meine Antwort unten
VonC

Antworten:

97

Git sucht an vier Stellen nach einer Konfigurationsdatei:

  1. Die Systemdatei Ihres Computers .gitconfig.
  2. Ihre Benutzerdatei befindet .gitconfigsich unter ~/.gitconfig.
  3. Eine zweite benutzerspezifische Konfigurationsdatei befindet sich unter $XDG_CONFIG_HOME/git/configoder $HOME/.config/git/config.
  4. Die Konfigurationsdatei des lokalen Repositorys .git/config.

Die Einstellungen werden in der folgenden Reihenfolge kaskadiert, wobei jede Datei Einstellungen hinzufügt oder überschreibt, die in der darüber liegenden Datei definiert sind.

  1. Systemkonfiguration.
  2. Benutzer Konfiguration.
  3. Repository-spezifische Konfiguration.

Mit den folgenden Befehlen können Sie sehen, was jede Datei definiert hat:

# 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

Sie können sehen, was nur die Repository-spezifische Datei definiert hat, indem Sie die Datei .git/configfür dieses Repository öffnen .

Wenn Sie msysGit auf Windows verwenden, werden Sie wahrscheinlich Ihre Benutzer finden ~/.gitconfigDatei , wo immer %homepath%Punkte , wenn Sie verwenden , echo %homepath%von einer Windows - Eingabeaufforderung.

Aus der Dokumentation fürgit config :

Wenn nicht explizit mit festgelegt --file, gibt es vier Dateien, in denen git confignach Konfigurationsoptionen gesucht wird:

  • $(prefix)/etc/gitconfig

    Systemweite Konfigurationsdatei.

  • $XDG_CONFIG_HOME/git/config

Zweite benutzerspezifische Konfigurationsdatei. Wenn $XDG_CONFIG_HOMEnicht gesetzt oder leer, $HOME/.config/git/configwird verwendet. Jede einwertige Variable, die in dieser Datei festgelegt ist, wird von dem, was sich darin befindet, überschrieben ~/.gitconfig. Es ist eine gute Idee, diese Datei nicht zu erstellen, wenn Sie manchmal ältere Versionen von Git verwenden, da die Unterstützung für diese Datei erst vor kurzem hinzugefügt wurde.

  • ~/.gitconfig

Benutzerspezifische Konfigurationsdatei. Wird auch als "globale" Konfigurationsdatei bezeichnet.

  • $GIT_DIR/config

    Repository-spezifische Konfigurationsdatei.

Wenn keine weiteren Optionen angegeben sind, lesen alle Leseoptionen alle verfügbaren Dateien. Wenn die globale oder die systemweite Konfigurationsdatei nicht verfügbar sind, werden sie ignoriert. Wenn die Repository-Konfigurationsdatei nicht verfügbar oder lesbar ist, git configwird sie mit einem Fehlercode ungleich Null beendet. In keinem Fall wird jedoch eine Fehlermeldung ausgegeben.

Die Dateien werden in der oben angegebenen Reihenfolge gelesen, wobei der zuletzt gefundene Wert Vorrang vor den zuvor gelesenen Werten hat. Wenn mehrere Werte verwendet werden, werden alle Werte eines Schlüssels aus allen Dateien verwendet.

Alle Schreiboptionen schreiben standardmäßig in die repository-spezifische Konfigurationsdatei. Beachten Sie, dass dies auch Optionen wie --replace-allund betrifft --unset. git config ändert immer nur eine Datei gleichzeitig.

Sie können diese Regeln entweder durch Befehlszeilenoptionen oder durch Umgebungsvariablen überschreiben. Die --globalund die --systemOptionen begrenzen die Datei verwendet , um die globale oder systemweite Datei sind. Die GIT_CONFIGUmgebungsvariable hat einen ähnlichen Effekt, Sie können jedoch einen beliebigen Dateinamen angeben.

Peter Mortensen
quelle
3
Wo ist die "Systemdatei des Computers .gitconfig" unter Windows mit msysgit?
DanielSank
3
@ DanielSank versuchen C:\Program Files (x86)\Git\etc\gitconfig. Ich bin mir nicht sicher, ob das das richtige ist.
@ Cupcake: Ja, das war es. Aus irgendeinem Grund kann ich diese Datei jedoch nicht ändern. Ein Prozess hält daran fest ... kann nicht herausfinden, welcher. Ich denke, es spielt keine Rolle, da ich die Konfigurationen auf Benutzerebene einfach überschreiben kann. Vielen Dank.
DanielSank
2
Aktuelle Git liestC:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth
1
@ KevinSmyth dies wurde kürzlich geändert inC:\Program Files\Git\etc\gitconfig
Enrice
62

Mit git 2.8 müssen Sie nicht mehr raten, welche Konfiguration wo eingestellt wurde! (März 2016)

Siehe Commit 70bd879 , Commit 473166b , Commit 7454ee3 , Commit 7454ee3 (19. Februar 2016), Commit 473166b , Commit 7454ee3 (19. Februar 2016), Commit 7454ee3 (19. Februar 2016) und Commit a0578e0 (17. Februar 2016) von Lars Schneider ( larsxschneider) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit dd0f567 , 26. Februar 2016)

config: --show-originOption ' ' hinzufügen, um den Ursprung eines Konfigurationswerts zu drucken

Wenn Konfigurationswerte abgefragt werden mit ‚ git config‘ (zB über --get, --get-all, --get-regexp, oder --listFlag) , dann ist es manchmal schwierig , die Konfigurationsdatei zu finden , wo die Werte definiert.

Lehren Sie git configdie --show-originOption ' ' the ' ', um die Quellkonfigurationsdatei für jeden gedruckten Wert zu drucken.

Die git configManpage zeigt nun an:

--show-origin:

Erweitern Sie die Ausgabe aller abgefragten Konfigurationsoptionen um den Ursprungstyp (Datei, Standardeingabe, Blob, Befehlszeile) und den tatsächlichen Ursprung (Pfad der Konfigurationsdatei, Referenz oder Blob-ID, falls zutreffend).

Beispielsweise:

git config --list --show-origin

Das wird zurückkehren:

    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

Für eine Einstellung, wie von wisbucky kommentiert :

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

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

Mit Git 2.26 (Q1 2020) können Sie die --show-scopeOption hinzufügen :

git config -l --show-origin --show-scope
VonC
quelle
1
Danke Gott. So viele verschiedene Artikel online raten, wo Git-Konfigurationen gespeichert wurden. In allen Artikeln wurde ein möglicher Speicherort übersehen, der zufällig auf meinem Computer eingerichtet wurde: c: \ programdata \ git \ config. Ich weiß nicht, warum es dort ist, aber ich vermute die TFS-Integration von Visual Studio. Die anderen seltsamen Orte, nach denen ich viel zu viel Zeit verbringe, waren: C: \ Programme \ mingw64 \ etc \ .gitconfig und H: \. Gitconfig. Gott sei Dank für diesen neuen Befehl. Jesus. Christus.
RMuesi
Ich frage mich, warum user.cmdline=truefür --show-origindie Arbeit erforderlich ist ? Außerdem ist mir aufgefallen, dass --show-origindies unmittelbar danach sein configmuss, um mit --getund zu arbeiten--get-all . So sollte es sein... config --show-origin --get-all core.autocrlf
wisbucky
@wisbucky Einverstanden: Ich entferne das -c 'user.cmdline=true'Bit, das sich auf den Testumfang zu beziehen scheint: github.com/git/git/blob/…
Testumfang
@wisbucky Und ich habe Ihr Beispiel für eine Einstellung aufgenommen.
VonC
@VonC, Ah scheint user.cmdline=truein Git 2.13 notwendig zu sein, wird aber in Git 2.15 nicht mehr benötigt.
wisbucky
10

Nachdem ich Git für Windows zuvor installiert und anschließend deinstalliert hatte, stellte ich fest, dass eine Konfigurationsdatei installiert ist, bei C:\Users\All Users\Git\configder es sich um eine Konfigurationsdatei auf Systemebene handelt, die weiterhin alle zukünftigen MinGW32-Git-Pakete betrifft (in meinem Fall habe ich ein portables MinGW32 ausgeführt) Git-Paket von meiner Firma zur Verfügung gestellt). Als ich rannte

git config --system --edit

Es würde mir die Systemkonfigurationsdatei anzeigen, die sich unter befindet mingw32/etc/gitconfig, aber es würde immer noch die Werte vom ersten Speicherort laden. Dies wurde als Warnung angezeigt, dass Konfigurationswerte beim Versuch, Git LFS zu verwenden, kollidierten .

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"

(Hinweis: Dies kann auch eine Situation sein, in der LFS-Warnungen zu durchsetzungsfähig sind, # 861 )

jinxcat2008
quelle
Das ist sehr nützlich. Hätte diese Datei nie bei All Users gefunden. Was hast du damit gemacht?
T3rm1
1
Ich habe die 'Git'-Ordner aus C: \ Users \ All Users \ (ein Alias ​​für C: \ ProgramData) und C: \ Users \ foo \ AppData \ Local \ Programs \ entfernt, wodurch alle verbleibenden Konfigurationsdateien entfernt wurden.
Jinxcat2008
3

Sie können verwenden --show-origin , um herauszufinden, woher die Konfigurationen stammen.

Priorität der Konfigurationsdateien in Git für Windows:

...

$PROGRAMDATA/Git/config::
(nur Windows) Systemweite Konfigurationsdatei, die mit anderen Git-Implementierungen geteilt wird. Zeigt $PROGRAMDATA normalerweise aufC:\ProgramData .

$(prefix)/etc/gitconfig::
Systemweite Konfigurationsdatei. (Nur Windows) Diese Datei enthält nur die Einstellungen, die für diese Installation von Git für Windows spezifisch sind und die nicht mit anderen Git-Implementierungen wie JGit, libgit2 geteilt werden sollten. --systemwählt diese Datei aus.

$XDG_CONFIG_HOME/git/config::
Zweite benutzerspezifische Konfigurationsdatei. Wenn $XDG_CONFIG_HOMEnicht gesetzt oder leer, $HOME/.config/git/configwird verwendet. Jede einwertige Variable, die in dieser Datei festgelegt ist, wird von dem, was sich darin befindet, überschrieben ~/.gitconfig. Es ist eine gute Idee, diese Datei nicht zu erstellen, wenn Sie manchmal ältere Versionen von Git verwenden, da die Unterstützung für diese Datei erst vor kurzem hinzugefügt wurde.

~/.gitconfig::
Benutzerspezifische Konfigurationsdatei. Wird auch als "globale" Konfigurationsdatei bezeichnet.

$GIT_DIR/config::
Repository-spezifische Konfigurationsdatei.

...

Die Dateien werden in der oben angegebenen Reihenfolge gelesen, wobei der zuletzt gefundene Wert Vorrang vor den zuvor gelesenen Werten hat.

...

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

$PROGRAMDATAist eine Umgebungsvariable. Sie können den Wert dieser Variablen wie folgt abrufen:

In Git Bash müssen Sie verwenden echo "$ProgramData". In CMD müssen Sie verwenden echo %PROGRAMDATA%. Beachten Sie, dass Git Bash anscheinend vorgibt, dass Umgebungsvariablen zwischen Groß- und Kleinschreibung unterscheiden.

Was ist $(prefix)?

Das Präfix ist das Verzeichnis der obersten Ebene, in das die Dinge installiert werden. In Git für Windows ist das entweder <some-path>/mingw64oder <some-path>/mingw32.

Ini
quelle
3

git config -l Zeigt alle geerbten Werte von System, Global und Lokal an.

Sie haben also irgendwo eine andere Konfigurationsdatei, die zusammen mit Ihrer benutzerdefinierten .gitconfigDatei geladen wird .

CBIII
quelle
Vielen Dank, Ihre Antwort hat mich auf den Unterschied zwischen System und Global aufmerksam gemacht. Die Antwort von @ Cupcake mit den --system-Flags hat mir jedoch geholfen, die Datei zu finden.
RyanW
2

Eine vollständige Antwort für Windows (dh eine Windows-Version der akzeptierten Antwort):

Wie Linux verfügt Windows über vier Ebenen von Konfigurationsdateien / -einstellungen und drei sind direkte Entsprechungen. Das Wichtigste ist das andere - das "Alle Apps / Benutzer" - insbesondere, da hier das Installationsprogramm Werte festlegt, z. B. "core.autocrlf = true", und dennoch nicht über die Befehlszeile darauf zugegriffen werden kann so verursacht es Verwirrung.

Alle Anwendungen und Benutzer

Dies ist wie eine freigegebene Version der 'System'-Einstellungen, falls Sie mehrere Git-Anwendungen installiert haben. Es gibt keinen Befehl 'git config', um auf diese zuzugreifen, aber sie wirken sich immer noch auf das Nettoergebnis einer Einstellung aus.

Speicherort der Konfigurationsdatei:

C: \ ProgramData \ Git \ config

(Beachten Sie, dass 'ProgramData' in älteren Windows-Versionen 'All Users' war.)

System

Speicherort der Konfigurationsdatei: C: / Programme / Git / mingw64 / etc / gitconfig

$ git config --system --list

Benutzer

Speicherort der Konfigurationsdatei:% USERPROFILE% .gitconfig (Dies wird in 'C: / Users / <Benutzername>' aufgelöst.)

$ git config --global --list

Repository

Speicherort der Konfigurationsdatei: [aktuelles Repository-Verzeichnis] ​​/. Git / config

$ git config --local --list
Tom
quelle
1

Unter Windows 7 (möglicherweise gleich oder ähnlich für Windows 10), für Visual Studio und die Git-Befehlszeile befindet sich Ihre globale Konfiguration in:

%USERPROFILE%\.gitconfig

(Punkt steht vor dem Dateinamen)

Dies wird jedoch von Sourcetree zumindest im Git Embedded-Modus nicht berücksichtigt, und die Konfiguration erfolgt in:

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

(kein Punkt vor dem Dateinamen)

(Ich musste beide Dateien aktualisieren, um meine globalen Git-Einstellungen für den Git-Befehl und Sourcetree zu ändern.)

Ein weiterer lustiger Teil. Die Git-Hooks-Konfiguration funktionierte vom AppData\Local\...Standort aus, jedoch nach weiteren Recherchen über Process Monitor stellte ich fest, dass Sourcetree für meinen Benutzer auch global von einem vom Unternehmen zugeordneten Laufwerk lädt.

Dies ist sehr wenig sinnvoll, da nur sehr wenige Anwendungen diesen Speicherort suchen, Sourcetree jedoch irgendwie. Wenn Sie es also nicht schaffen, gemäß den Standorteinstellungen in Sourcetree zu arbeiten, führen Sie Process Monitor aus und erstellen Sie eine Regel, um nur den Pfad zu protokollieren, der gitconfig und Sie enthält kann herausfinden, wo sich Ihre globale Konfiguration im Fall eines Benutzerverzeichnisses mit Netzwerkzuordnung wirklich befindet.

Und dies ist möglicherweise nicht einmal ein Fehler von Sourcetree, da ich jetzt beim Schreiben sehe, dass git.exe das lädt, aber dies geschieht nur für git.exe, das von Sourcetree ausgeführt wird, während Git eine direkte Befehlszeile verwendet %USERPROFILE%\.gitconfig

Geben Sie hier die Bildbeschreibung ein

Schließlich nahm ich alle Ergebnisse von Process Monitor, speiste sie in SQL Server ein und führte eine Abfrage aus, um eindeutige Ergebnisse zu erhalten (keine bestimmte Ausführungsreihenfolge, nur nach Pfad sortiert):

Geben Sie hier die Bildbeschreibung ein

Ich weiß nicht, wie diese Konfigurationen miteinander zusammenhängen, aber ich weiß, dass einige andere überschreiben, andere Einstellungen von einem Ort aus funktionieren, andere von einem anderen.

Und die obige Liste wird von Sourcetree aufgerufen , wieder scheint eine direkte Befehlszeile mit Git gut zu funktionieren %USERPROFILE%\.gitconfig, und das ist nicht in dieser Liste, aber es würde so aussehen (unter Windows 7)C:\Users\pawel.cioch\.gitconfig

Pawel Cioch
quelle
1

Darüber hinaus haben Sie das git config -l --show-origin, was ich hier mit Git 2.8 (März 2016) vorgestellt habe, jetzt mit Git 2.26 (Q1 2020)

git config -l --show-scope

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

git configlernte zu zeigen, in welchem ​​" scope" zusätzlich zu welcher Datei jede Konfigurationseinstellung stammt.

Siehe Commit 145d59f , Commit 9a83d08 , Commit e37efa4 , Commit 5c105a8 , Commit 6766e41 , Commit 6dc905d , Commit a5cb420 (10. Februar 2020) und Commit 417be08 , Commit 3de7ee3 , Commit 329e6ec (24. Januar 2020) von Matthew Rogers ( ROGERSM94) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 5d55554 , 17. Februar 2020)

config: Fügen Sie '--show-scope' hinzu, um den Bereich eines Konfigurationswerts zu drucken

Unterzeichnet von: Matthew Rogers

Wenn ein Benutzer Konfigurationswerte mit abfragt --show-origin, ist es oft schwierig zu bestimmen, was das tatsächliche " scope" ( local,global usw.) eines bestimmten Wertes auf nur die Herkunft Datei basiert.

Bringen Sie 'git config' die --show-scopeOption ' ' bei, um den Bereich aller angezeigten Konfigurationswerte zu drucken.

Beachten Sie, dass wir niemals etwas vom Bereich "Submodul" sehen sollten, da dies nur submodule-config.cbeim Parsen der Datei ".gitmodules" verwendet wird.

Beispiel:

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
quelle
-1

Wenn Sie den tatsächlichen Dateispeicherort suchen möchten, befindet er sich in Ihrem Home-Verzeichnis.

Es ist versteckt und mit einem "." Vorangestellt.

Wenn Sie also einen Mac verwenden, können Sie ihn in Ihrem Terminal cd ~ && open .gitconfigmit Ihrem bevorzugten Texteditor öffnen oder öffnen, z cd ~ && atom .gitconfig.

AshNaz87
quelle
1
Dies wurde bereits gesagt. Sie müssen keine Verwirrung stiften, indem Sie eine (Nicht-) Alternative vorschlagen.
Stim