Я хочу использовать на своей машине два «профиля» 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.
@TTT: То есть вы предлагаете поставить includeIf
в конце глобальной конфигурации? Я попробую.
Да, именно, я подозреваю, что это решит проблему.
@TTT: Хорошо, это сработало. Поставьте это в качестве ответа, и я дам его вам.
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
в конец глобальной конфигурации, эти значения будут установлены последними, и они будут окончательными значениями.
Конфигурация читается по порядку, и я считаю, что побеждает последняя из повторяющихся настроек. Есть ли шанс, что разница между тем, что работает, а что нет, заключается в том, появляется ли это до или после строки includeif?