语境
在我的计算机上,我在 中设置了一个全局 git 用户~/.gitconfig
,其中包含我的私人详细信息:
[user]
name = ebosi
email = [email protected]
signingkey = 0123456789ABCDEF
但是,我希望这些全局设置被某些特定存储库(例如工作存储库)中的其他凭据覆盖。在这种情况下,我会编辑本地 git 配置(例如~/work/project/.git/config
),如下所示:
[user]
name = ebosi
email = [email protected]
signingkey = FEDCBA9876543210
问题
我想用正确的身份对我的提交进行 GPG 签名:默认为私有的,除非在 repo 配置中被覆盖。
但是,当我 时git commit -sS
,git 可以正确获取签名身份,但 gpg 密钥却无法获取。要使用我的公司密钥对提交进行签名,我需要git commit -s -SFEDCBA9876543210
问题
如何让 git 自动选择正确的 gpg 密钥? (即,如果存在,则
使用 中定义的签名密钥,否则使用 中的签名密钥)./.git/config
~/.gitconfig
答案1
免责声明:这个答案在很大程度上基于 Kiss 的教程这里(档案)。
解决我们的问题是通过有条件进口工作的git config设置,基于项目的路径。
这很简单:
创造一个新的 git 配置文件,例如
~/.gitconfig_work
:touch ~/.gitconfig_work
编辑为定义“工作” git 配置:
[user] name = ebosi email = [email protected] signingkey = FEDCBA9876543210
加载此文件有条件的从
~/.gitconfig
:[user] name = ebosi email = [email protected] signingkey = 0123456789ABCDEF … [includeIf "gitdir:~/work/"] path = ~/.gitconfig_work
最后一步很巧妙:它告诉 git加载“工作配置”(从而覆盖默认设置)仅当 repo 位于~/work/
工作目录中时(或其任何子目录)。
注意:
- 您指定
gitdir
使用.gitignore
与文件中的语法相同 path = ~/.gitconfig_work
将简单地扩展到工作配置文件中的内容,因此您也可以简单地进行.gitconfig
如下编辑:[user] name = ebosi email = [email protected] signingkey = 0123456789ABCDEF [includeIf "gitdir:~/work/"] [user] name = ebosi email = [email protected] signingkey = FEDCBA9876543210
.gitconfig
从上到下进行处理,因此如果您想覆盖全局参数,请确保导入新的配置后默认的。接下来的内容(其中键按字母顺序排序)将不是工作:[includeIf "gitdir:~/work/"] path = ~/.gitconfig_work [user] name = ebosi email = [email protected] signingkey = 0123456789ABCDEF