Откуда берутся настройки в моей конфигурации 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 места для файла конфигурации:
- Система вашей машины
.gitconfig
файл. - Ваш пользователь
.gitconfig
файл находится в~/.gitconfig
, - Второй пользовательский файл конфигурации, расположенный по адресу
$XDG_CONFIG_HOME/git/config
или же$HOME/.config/git/config
, - Конфигурационный файл локального репо
.git/config
,
Настройки каскадируются в следующем порядке, каждый файл добавляет или переопределяет настройки, определенные в файле над ним.
- Конфигурация системы.
- Конфиг пользователя.
- Репо-специфичный конфиг.
Вы можете увидеть, что каждый файл определил, используя следующие команды:
# 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, в вашем терминале вы можете cd ~ && open .gitconfig
или откройте его в вашем любимом текстовом редакторе, например cd ~ && atom .gitconfig
,