Откуда берутся настройки в моей конфигурации Git?

Я заметил, что у меня есть 2 объявления для core.autocrlf когда я бегу 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

Те последние 3 (от user.name вниз) являются единственными в моем c:\users\username\.gitconfig файл. Откуда все остальные? Почему core.autocrlf указан дважды?

Это с msysgit 1.8.3, и у меня также установлен SourceTree (Windows 7). В SourceTree я снял флажок "Разрешить SourceTree изменять ваши глобальные файлы конфигурации Git"

10 ответов

Решение

Git проверяет 4 места для файла конфигурации:

  1. Система вашей машины .gitconfig файл.
  2. Ваш пользователь .gitconfig файл находится в ~/.gitconfig,
  3. Второй пользовательский файл конфигурации, расположенный по адресу $XDG_CONFIG_HOME/git/config или же $HOME/.config/git/config,
  4. Конфигурационный файл локального репо .git/config,

Настройки каскадируются в следующем порядке, каждый файл добавляет или переопределяет настройки, определенные в файле над ним.

  1. Конфигурация системы.
  2. Конфиг пользователя.
  3. Репо-специфичный конфиг.

Вы можете увидеть, что каждый файл определил, используя следующие команды:

# 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

Вы можете увидеть, что определил только файл репо, открыв файл .git/config для этого репо.

Если вы используете msysgit в Windows, вы, вероятно, найдете своего пользователя ~/.gitconfig файл где когда-либо %homepath% указывает на то, если вы используете echo %homepath% из командной строки Windows.

Из документации дляgit config:

Если не установлено явно с --fileЕсть четыре файла, где git config будет искать параметры конфигурации:

  • $(prefix)/etc/gitconfig

    Общесистемный файл конфигурации.

  • $XDG_CONFIG_HOME/git/config

    Второй пользовательский файл конфигурации. Если $XDG_CONFIG_HOME не установлен или пуст, $HOME/.config/git/config будет использоваться. Любая однозначная переменная, установленная в этом файле, будет перезаписана любым ~/.gitconfig, Не рекомендуется создавать этот файл, если вы иногда используете более старые версии Git, так как поддержка этого файла была добавлена ​​сравнительно недавно.

  • ~/.gitconfig

    Пользовательский файл конфигурации. Также называется "глобальным" файлом конфигурации.

  • $GIT_DIR/config

    Конфигурационный файл репозитория.

Если дополнительные параметры не указаны, все параметры чтения будут читать все эти файлы, которые доступны. Если глобальный или общесистемный файл конфигурации недоступен, они будут игнорироваться. Если файл конфигурации хранилища недоступен или не доступен для чтения, git config выйдет с ненулевым кодом ошибки. Однако ни в одном из случаев не будет выдано сообщение об ошибке.

Файлы читаются в указанном выше порядке, причем последнее найденное значение имеет приоритет над значениями, прочитанными ранее. Когда взяты несколько значений, будут использоваться все значения ключа из всех файлов.

По умолчанию все параметры записи будут записываться в файл конфигурации конкретного хранилища. Обратите внимание, что это также влияет на такие параметры, как --replace-all а также --unset, git config будет когда-либо изменять только один файл за раз.

Вы можете переопределить эти правила либо с помощью параметров командной строки, либо с помощью переменных среды. --global и --system options ограничит используемый файл глобальным или общесистемным файлом соответственно. GIT_CONFIG Переменная окружения имеет аналогичный эффект, но вы можете указать любое имя файла.

Вам больше не нужно угадывать, где был установлен конфиг, с помощью git 2.8! (Март 2016 г.)

См. Коммит 70bd879, коммит 473166b, коммит 7454ee3, коммит 7454ee3 (19 февраля 2016 г.), коммит 473166b, коммит 7454ee3 (19 фев. 2016 г.), коммит 7454ee3 (19 фев. 2016 г.) и коммит a0578e0 (17 фев. 2016 г.) от Lars Schneider ( larsxschneider )
(Объединено Юнио С Хамано - gitster - в коммите dd0f567, 26 февраля 2016 г.)

конфиг: добавить ' --show-origin опция для печати источника значения конфигурации

Если значения конфигурации запрашиваются с помощью ' git config '(например, через --get, --get-all, --get-regexp, или же --list флаг), то иногда бывает трудно найти файл конфигурации, в котором были определены значения.

Учат ' git config 'the' --show-origin опция печати исходного файла конфигурации для каждого напечатанного значения.

git config Страница man теперь будет отображать:

--show-origin:

Дополните выходные данные всех запрашиваемых параметров конфигурации типом источника (файл, стандартный ввод, большой двоичный объект, командная строка) и фактическим источником (путь к файлу конфигурации, ref или идентификатор большого двоичного объекта, если применимо).

Например:

git config --list --show-origin

Это вернется:

    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

Для одной настройки, как прокомментировал wisbucky:

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

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

После предварительной установки Git для Windows и последующей ее деинсталляции я обнаружил, что в C:\Users\All Users\Git\config установлен файл конфигурации, который является файлом конфигурации системного уровня, который сохраняется и повлияет на любые будущие git-пакеты mingw32. (в моем случае я использовал переносной git-пакет mingw32, предоставленный моей компанией). Когда я побежал

git config --system --edit

он покажет мне системный конфигурационный файл, расположенный по адресу mingw32/etc/gitconfig, но все равно загрузит значения из первого расположения. Это показало как предупреждение, что значения конфигурации конфликтуют при попытке использовать 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"

(Примечание: это также может быть ситуация, когда предупреждения LFS слишком настойчивы # 861)

В дополнение к git config -l --show-origin, который я представил здесь, с git 2.8 (март 2016 г.), теперь у вас есть с Git 2.26 (1 квартал 2020 г.)

git config -l --show-scope

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

git config научился показывать в каком "scope", помимо файла, из которого взяты все настройки конфигурации.

См. Фиксацию 145d59f, фиксацию 9a83d08, фиксацию e37efa4, фиксацию 5c105a8, фиксацию 6766e41, фиксацию 6dc905d, фиксацию a5cb420 (10 февраля 2020 г.) и фиксацию 417be08, фиксацию 3de7ee3, фиксацию 329e6ec (24 января 2020 г.) Мэтью Роджерс (ROGERSM94).
(Слияние Junio ​​C Hamano -gitster- в коммите 5d55554, 17 февраля 2020 г.)

config: добавьте '--show-scope', чтобы распечатать объем значения конфигурации

Подписано: Мэтью Роджерс

Когда пользователь запрашивает значения конфигурации с помощью --show-origin, часто бывает трудно определить, что на самом деле "scope"(local, globalи т. д.) заданного значения основывается только на исходном файле.

Научите 'git config'--show-scope'возможность распечатать объем всех отображаемых значений конфигурации.

Обратите внимание, что мы никогда не должны видеть ничего из области "подмодуля", поскольку это всегда используется только submodule-config.c при разборе файла.gitmodules.

Пример:

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

Ты можешь использовать --show-origin чтобы выяснить, откуда берутся конфигурации.

Приоритет файлов конфигурации в Git для Windows:

...

$PROGRAMDATA/Git/config::
(Только для Windows) Общесистемный файл конфигурации, доступный другим реализациям Git. типично $PROGRAMDATA указывает на C:\ProgramData,

$(prefix)/etc/gitconfig::
Общесистемный файл конфигурации. (Только для Windows) Этот файл содержит только те параметры, которые характерны для данной установки Git для Windows и которые не должны использоваться совместно с другими реализациями Git, такими как JGit, libgit2. --system выберет этот файл.

$XDG_CONFIG_HOME/git/config::
Второй пользовательский файл конфигурации. Если $XDG_CONFIG_HOME не установлен или пуст, $HOME/.config/git/config будет использоваться. Любая однозначная переменная, установленная в этом файле, будет перезаписана любым ~/.gitconfig, Не рекомендуется создавать этот файл, если вы иногда используете более старые версии Git, так как поддержка этого файла была добавлена ​​сравнительно недавно.

~/.gitconfig::
Пользовательский файл конфигурации. Также называется "глобальным" файлом конфигурации.

$GIT_DIR/config::
Конфигурационный файл репозитория.

...

Файлы читаются в указанном выше порядке, причем последнее найденное значение имеет приоритет над значениями, прочитанными ранее.

...

Источник: https://github.com/git-for-windows/git/blob/master@%7B2018-01-07%7D/Documentation/git-config.txt

$PROGRAMDATA переменная среды Вы можете получить значение этих переменных следующим образом:

В Git Bash вам нужно использовать echo "$ProgramData", В CMD нужно использовать echo %PROGRAMDATA%, Обратите внимание, что Git Bash, видимо, делает вид, что переменные окружения чувствительны к регистру.

Что такое $(prefix)?

Префикс - это каталог верхнего уровня, в который все устанавливается. В Git для Windows это тоже <some-path>/mingw64 или же <some-path>/mingw32,

Git config -l показывает все унаследованные значения из: системного, глобального и локального.

Итак, у вас есть другой конфигурационный файл, который загружается вместе с вашим пользователем.gitconfig

Полный ответ для Windows (т.е. версия принятого ответа для Windows):

Как и в Linux, в Windows есть четыре уровня файлов конфигурации / настроек, три из которых являются прямыми эквивалентами. Важно отметить еще один - "Все приложения / пользователи" - особенно потому, что именно здесь установщик устанавливает значения, например, "core.autocrlf = true", но к нему нельзя получить доступ из командной строки. так что это вызывает путаницу.

Все приложения и пользователи

Это похоже на общую версию "системных" настроек, если у вас установлено несколько приложений Git. Для доступа к ним нет команды git config, но они все равно влияют на чистый результат настройки.

Расположение файла конфигурации:

C:\ProgramData\Git\config

(Обратите внимание, что "ProgramData" было "Все пользователи" в более старых версиях Windows.)

Система

Расположение файла конфигурации: C:/Program Files/Git/mingw64/etc/gitconfig

$ git config --system --list

Пользователь

Расположение файла конфигурации: %USERPROFILE%.gitconfig (преобразуется в 'C: / Users /')

$ git config --global --list

Репозиторий

Расположение файла конфигурации: [текущий каталог репозитория]/. Git / config

$ git config --local --list

В Windows 7  (может быть, такой же или похожей для Windows 10) для Visual Studio и командной строки git ваша глобальная конфигурация находится в

%USERPROFILE%\.gitconfig

(точка находится перед файлом)

но это не соблюдается SourceTree по крайней мере в режиме Git Embedded, и конфигурация находится в

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

(нет точки перед файлом)

[Мне нужно было обновить оба файла, чтобы изменить мои глобальные настройки git для команды git и SourceTree]

Еще одна забавная часть. Конфиг Git Hooks работал с AppData\Local\... местоположение, но после дополнительных исследований с помощью procmon, я заметил, что SourceTree также загружает глобальные данные из подключенного диска компании для моего пользователя. Это имеет очень мало смысла, так как очень немногие приложения ищут это местоположение, так или иначе ST делает это, если вы не можете заставить работать по настройкам местоположения в ST, запустите procmon.exe и создайте правило для регистрации только пути, содержащего gitconfig, и вы можете найти где действительно ваш глобальный конф в случае сетевого сопоставленного пользовательского каталога. И это может даже не быть ошибкой ST, поскольку теперь я вижу, как я пишу это, что git.exe загружает это, но это происходит только для git.exe, выполняемого ST, в то время как git использует прямую командную строку %USERPROFILE%\.gitconfig

Наконец, я взял все результаты из procmon, вставил их в SQL и запустил запрос, чтобы получить отличные результаты (без определенного порядка выполнения, просто отсортированного по пути):

Я не знаю, как эти конфиги связаны друг с другом, но я знаю, что некоторые переопределяют другие, некоторые настройки работают из одного местоположения, некоторые из другого. И приведенный выше список вызывается SourceTree, опять же, прямая командная строка с git, кажется, хорошо работает с %USERPROFILE%\.gitconfig и это не в этом списке, но будет выглядеть так (на Win7) c:\Users\pawel.cioch\.gitconfig

В Mac это /usr/local/git/etc/gitconfig-_-

Если вы хотите найти фактическое местоположение файла, он будет в вашем домашнем каталоге.

Он скрыт и предшествует "."

Так что если вы на Mac, в вашем терминале вы можете cd ~ && open .gitconfig или откройте его в вашем любимом текстовом редакторе, например cd ~ && atom .gitconfig,

Другие вопросы по тегам