Параметр конфигурации git не переопределяется в файле конфигурации `includeIf`

Я хочу использовать на своей машине два «профиля» git: рабочий и личный. Я успешно делал это в течение многих лет, используя директиву includeIf в моем глобальном файле .gitconfig.

# ~/.gitconfig
[user]
    name = John Doe
    email = [email protected]
[includeIf "gitdir:/home/jdoe/dev/workstuff"]
    path = ~/dev/workstuff/.gitconfig


# ~/dev/workstuff/.gitconfig
[user]
    name = Jonathan Doe
    email = [email protected]

И если я проверю конфигурацию в соответствующих репозиториях, я получу соответствующие значения, как и ожидалось.

[~/dev/personal/app] $ git config --get user.name
John Doe
[~/dev/personal/app] $ git config --get user.email
[email protected]

[~/dev/workstuff/project/] $ git config --get user.name
Jonathan Doe
[~/dev/workstuff/project/] $ git config --get user.email
[email protected]

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

# ~/.gitconfig
[gpg]
    format = ssh
[commit]
    gpgsign = false


# ~/dev/workstuff/.gitconfig
[user]
    name = Jonathan Doe
    email = [email protected]
    signingkey= ~/.ssh/my_signing_key.pub
[gpg "ssh"]
    allowedSignersFile = ~/dev/workstuff/.git-allowed-signers
[commit]
    gpgsign = true

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

[~/dev/personal/app] $ git config --get user.signingkey
             # blank value, which is correct because I didn't set a global signing key
[~/dev/personal/app] $ git config --get commit.gpgsign
false        # correct

[~/dev/workstuff/project/] $ git config --get user.signingkey
~/.ssh/my_signing_key.pub
[~/dev/workstuff/project/] $ git config --get gpg.ssh.allowedSignersFile
~/dev/workstuff/.git-allowed-signers
[~/dev/workstuff/project/] $ git config --get commit.gpgsign
false        # 🤬🤬🤬

Я делаю что-то неправильно? Это известная ошибка? Обратите внимание, что я видел как gpgsign (строчные буквы), так и gpgSign (camelCase), используемые в различных ресурсах и руководствах. Я пробовал оба способа, но ни один из них не переопределяется правильно.

Использование git 2.43.2 в Ubuntu 22.04.

Конфигурация читается по порядку, и я считаю, что побеждает последняя из повторяющихся настроек. Есть ли шанс, что разница между тем, что работает, а что нет, заключается в том, появляется ли это до или после строки includeif?

TTT 18.06.2024 04:56

@TTT: То есть вы предлагаете поставить includeIf в конце глобальной конфигурации? Я попробую.

istrasci 18.06.2024 05:59

Да, именно, я подозреваю, что это решит проблему.

TTT 18.06.2024 07:21

@TTT: Хорошо, это сработало. Поставьте это в качестве ответа, и я дам его вам.

istrasci 18.06.2024 18:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

# ...

[user]
    name = John Doe
    email = [email protected]
[includeIf "gitdir:/home/jdoe/dev/workstuff"]
    path = ~/dev/workstuff/.gitconfig # this sets gpgsign to true

# ...

[commit]
    gpgsign = false # this sets gpgsign back to false

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

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