我想在我的机器上使用两个 git“配置文件”:工作和个人。 多年来,我使用全局 .gitconfig
文件中的
includeIf指令成功地完成了此操作。
# ~/.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]
最近我开始使用 SSH 密钥签署我的 git 提交。 但是,我只需要为我的 work 存储库执行此操作。 所以我在每个文件中添加了以下配置:
# ~/.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 (驼峰式)。 我已经尝试了两种方法,但两种方法都无法正确覆盖。
在 Ubuntu 22.04 中使用 git 2.43.2。
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
行移动到全局配置的底部,它将最后设置这些值,它们将是最终值。