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

Я заметил, что у меня есть два списка для 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
[email protected]
core.autocrlf=true

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

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

Ответы

Ответ 1

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

    System-wide configuration file.

  • $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 имеет аналогичный эффект, но вы Можно указать любое имя файла.

Ответ 2

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

См. коммит 70bd879, коммит 473166b, коммит 7454ee3, коммит 7454ee3 (19 февраля 2016 г.), коммит 473166b зафиксировать 7454ee3 (19 февраля 2016 г.), зафиксировать 7454ee3 (19 февраля 2016 г.) и зафиксировать a0578e0 (17 февраля 2016 г.) от Ларс Шнайдер ( larsxschneider) . (Merged by Junio C Hamano -- [TG41] -- in commit dd0f567, 26 Feb 2016)
config: добавьте опцию "--show-origin" для печати источника значения конфигурации

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

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

На

странице справочника git config man page теперь отображается:

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Вы можете использовать --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/[email protected]%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.

Ответ 6

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

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

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

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

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

C:\ProgramData\Git\Config

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

система

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

$ git config --system --list

User

пользователяРасположение файла конфигурации: % USERPROFILE%.gitconfig (Это разрешается как "C: /Users/& lt; username>")

$ git config --global --list

Repository

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

$ git config --local --list

Ответ 7

В 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

Enter image description here

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

Enter image description here

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

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

Ответ 8

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

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

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