Звідки беруться налаштування в моїй конфігурації 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"


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: додайте --show-originопцію ' ', щоб надрукувати початкове значення конфігурації

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

Навчіть опцію ' git config' ' --show-origin' друкувати вихідний конфігураційний файл для кожного друкованого значення.

На цій git configсторінці буде вказано:

--show-origin:

Збільште вихідні дані всіх запитуваних параметрів конфігурації за типом джерела (файл, стандартний вхід, BLOB-код, командний рядок) та фактичним початком (шлях до конфігураційного файлу, посилання або ідентифікатор BLOB-файлу, якщо це можливо).

Наприклад:

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

1
Дякую, Боже. Стільки різноманітних статей в Інтернеті, здогадуючись про те, де могли зберігатися конфігури git. У всіх статтях було пропущено одне з можливих розташувань, яке траплялося на моїй машині: c: \ programdata \ git \ config. Не знаю, чому це там, але я підозрюю, що Visual Studio інтегрував TFS. Інші дивні місця, на які я витрачаю занадто багато часу: C: \ program files \ mingw64 \ etc \ .gitconfig та H: \. Gitconfig. Слава Богу за цю нову команду. Ісусе. Христе.
РМуесі

Цікаво, навіщо 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 )


Це дуже корисно. Ніколи не знайшов би цей файл у всіх користувачів. Що ти з цим зробив?
T3rm1

1
Я видалив папки 'Git' з папок C: \ Users \ All Users \ (псевдонім C: \ ProgramData) і C: \ Users \ foo \ AppData \ Local \ Programs \, які видалили всі залишені конфігураційні файли.
jinxcat2008

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файлом.


Дякую, ваша відповідь вказує мені на різницю між системною та глобальною. Відповідь @ 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 / <username>')

$ git config --global --list

Сховище

Розташування файлу конфігурації: [поточний каталог сховища] /. Git / config

$ git config --local --list

2

Окрім того git config -l --show-origin, що я представив тут , з git 2.8 (березень 2016 р.), Тепер ти маєш Git 2.26 (Q1 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' the '--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

1

У Windows 7 (можливо однаковий або подібний для Windows 10), для Visual Studio та командного рядка Git ваша глобальна конфігурація знаходиться в:

%USERPROFILE%\.gitconfig

(крапка перед ім'ям файлу)

Але це не на честь Sourcetree, принаймні у вбудованому режимі Git, а конфігурація:

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

(без крапки перед іменем файлу)

(Мені потрібно було оновити обидва файли, щоб змінити мої загальні налаштування Git для команди Git та Sourcetree.)

Ще одна весела частина. Конфігурація Git hooks працювала з 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.


1
Це вже було сказано. Не потрібно додавати плутанини, пропонуючи (не) альтернативу.
Stim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.