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

88

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

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

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

RyanW
источник
18
Примечание: с git 2.8 (март 2016 г.) и git config --list --show-originвам не придется угадывать, какая конфигурация git находится где. См. Мой ответ ниже
VonC

Ответы:

97

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

  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ограничивают используемый файл глобальным или общесистемным файлом соответственно. GIT_CONFIGПеременная среды имеет такой же эффект, но вы можете указать любое имя файла , который вы хотите.

Питер Мортенсен
источник
3
Где находится "системный .gitconfigфайл машины " в Windows с msysgit?
DanielSank
3
@DanielSank попробуй C:\Program Files (x86)\Git\etc\gitconfig. Хотя не уверен, что это правильный вариант.
@Cupcake: Да, вот и все. По какой-то причине я не могу изменить этот файл. Какой-то процесс держится за него ... не могу понять, какой именно. Думаю, это не имеет значения, так как я могу просто переопределить конфигурацию на уровне пользователя. Спасибо.
DanielSank
2
Текущий Git читаетC:\Program Files\Git\mingw64\etc\gitconfig
Кевин Смит
1
@KevinSmyth это недавно изменилось наC:\Program Files\Git\etc\gitconfig
Enrice
63

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

См. Фиксацию 70bd879 , фиксацию 473166b , фиксацию 7454ee3 , фиксацию 7454ee3 (19 февраля 2016 г.), фиксацию 473166b , фиксацию 7454ee3 (19 февраля 2016 г.), фиксацию 7454ee3 (19 февраля 2016 г.) и фиксацию a0578e0 (17 февраля 2016 г.) Ларса Шнайдера ( larsxschneider) .
(Объединено Junio ​​C Hamano - gitster- в коммите dd0f567 , 26 февраля 2016 г.)

config: add ' --show-origin', чтобы распечатать происхождение значения конфигурации

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

Teach « git config» The « --show-originвариант» , чтобы распечатать файл конфигурации источника для каждого напечатанного значения.

git configСтраница людей руководства теперь будет указано:

--show-origin:

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

Например:

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 2.26 (Q1 2020) вы можете добавить --show-scopeопцию :

git config -l --show-origin --show-scope
VonC
источник
1
Слава Богу. В Интернете так много разных статей, в которых гадают, где могли храниться конфиги git. Во всех статьях пропущено одно возможное местоположение, которое было настроено на моем компьютере: c: \ programdata \ git \ config. Не знаю, почему он там, но подозреваю, что это интеграция Visual Studio с TFS. Другие странные места, на которые я трачу слишком много времени, были: C: \ program files \ mingw64 \ etc \ .gitconfig и H: \. Gitconfig. Слава богу за эту новую команду. Иисус. Христос.
RMuesi
интересно, почему user.cmdline=true это нужно для --show-originработы? Кроме того, я заметил, что это --show-originдолжно быть сразу после config, чтобы работать с --getи --get-all. Так и должно быть... config --show-origin --get-all core.autocrlf
wisbucky
@wisbucky Согласовано: я удаляю -c 'user.cmdline=true'бит, который, кажется, относится к области тестирования: github.com/git/git/blob/…
VonC
@wisbucky И я включил ваш пример для одной настройки.
VonC
@VonC, Ага вроде user.cmdline=trueбыло необходимо в Git 2.13, но больше не нужно в Git 2.15.
wisbucky
10

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

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 )

jinxcat2008
источник
Это очень полезно. Никогда бы не нашел этот файл у всех пользователей. Что ты с ним делал?
T3rm1 04
1
Я удалил папки Git из C: \ Users \ All Users \ (псевдоним C: \ ProgramData) и C: \ Users \ foo \ AppData \ Local \ Programs \, которые удалили все оставшиеся файлы конфигурации.
jinxcat2008 06
3

Ты можешь использовать --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#L231

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

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

Что есть $(prefix)?

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

Ини
источник
3

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

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

CBIII
источник
Спасибо, ваш ответ подсказал мне разницу между системным и глобальным. Ответ @ Cupcake с флагами --system помог мне найти файл.
RyanW
2

Полный ответ для 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
Том
источник
2

В дополнение к тому 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 ", помимо того, из какого файла берется каждый параметр конфигурации.

См. Commit 145d59f , commit 9a83d08 , commit e37efa4 , commit 5c105a8 , commit 6766e41 , commit 6dc905d , commit a5cb420 (10 февраля 2020 г.) и commit 417be08 , commit 3de7ee3 , commit 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
VonC
источник
1

В 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 работала на AppData\Local\...месте, но после дополнительных исследований с помощью Process Monitor я заметил, что почему-то Sourcetree также загружает глобально с диска, назначенного компанией, для моего пользователя.

Это имеет очень мало смысла, поскольку очень немногие приложения ищут это местоположение, но каким-то образом Sourcetree делает, поэтому, если вы не можете заставить его работать с настройками местоположения в Sourcetree, запустите Process Monitor и создайте правило для регистрации только пути, содержащего gitconfig, и вы может найти, где на самом деле находится ваша глобальная конфигурация, в случае сетевого каталога пользователя.

И это может быть даже не ошибка Sourcetree, поскольку я вижу сейчас, когда пишу это, что git.exe загружает это, но это происходит только для git.exe, выполняемого Sourcetree, в то время как прямая командная строка Git использует %USERPROFILE%\.gitconfig

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

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

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

Я не знаю, как эти конфигурации связаны друг с другом, но я знаю, что некоторые переопределяют другие, некоторые настройки работают из одного места, некоторые из другого.

И приведенный выше список вызывается Sourcetree , снова прямая командная строка с Git, похоже, отлично работает %USERPROFILE%\.gitconfig, и этого нет в этом списке, но это будет выглядеть так (в Windows 7)C:\Users\pawel.cioch\.gitconfig

Павел Чох
источник
-1

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

Он скрыт, и перед ним стоит «.».

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

AshNaz87
источник
1
Об этом уже было сказано. Не нужно добавлять путаницу, предлагая (не) альтернативу.
Стим