覆盖 git 存储库中的默认 GPG 密钥

ebo*_*osi 5 git gnupg

语境

在我的机器上,我已经在 中设置了一个全局 git 用户~/.gitconfig,其中包含我的私人详细信息:

[user]
    name = ebosi
    email = me@private-email.com
    signingkey = 0123456789ABCDEF
Run Code Online (Sandbox Code Playgroud)

但是,我希望这些全局设置被某些特定存储库中的其他凭据(例如工作凭据)覆盖。在这种情况下,我编辑本地 git 配置(例如~/work/project/.git/config),如下所示:

[user]
    name = ebosi
    email = ebosi@corporate.com
    signingkey = FEDCBA9876543210
Run Code Online (Sandbox Code Playgroud)

问题

我想使用正确的身份对我的提交进行 GPG 签名:默认为私有身份,除非在存储库配置中被覆盖。

但是,当我 时git commit -sS,git 正确地获取了签核身份,但没有获取 gpg 密钥。要使用我的公司密钥签署提交,我需要git commit -s -SFEDCBA9876543210

问题

如何让 git 自动选择正确的 gpg 密钥?
(即 if 存在中定义的签名密钥./.git/config,否则 中定义的签名密钥~/.gitconfig

ebo*_*osi 4

免责声明:这个答案广泛基于此处提供的 Kiss 教程(存档)。

\n\n
\n\n

解决我们的问题是通过基于项目路径有条件导入工作 git 配置设置来完成的。

\n\n

这很简单:

\n\n
    \n
  1. 创建一个新的 git 配置文件,例如~/.gitconfig_work

    \n\n
    touch ~/.gitconfig_work\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 编辑它以定义 \xe2\x80\x9cwork\xe2\x80\x9d git config

    \n\n
    [user]\n    name = ebosi\n    email = ebosi@corporate.com\n    signingkey = FEDCBA9876543210\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. 有条件地从以下位置加载此文件~/.gitconfig

    \n\n
    [user]\n    name = ebosi\n    email = me@private-email.com\n    signingkey = 0123456789ABCDEF\n\n\xe2\x80\xa6\n\n[includeIf "gitdir:~/work/"]\n    path = ~/.gitconfig_work\n
    Run Code Online (Sandbox Code Playgroud)
  6. \n
\n\n

最后一步是聪明的一点:它告诉 git当存储库位于~/work/工作目录(或任何它的子目录)。

\n\n

注意:

\n\n
    \n
  • gitdir使用与文件中相同的语法指定.gitignore
  • \n
  • path = ~/.gitconfig_work将简单地扩展到工作配置文件中的内容,因此您也可以简单地进行.gitconfig如下编辑:

    \n\n
    [user]\n    name = ebosi\n    email = me@private-email.com\n    signingkey = 0123456789ABCDEF\n\n[includeIf "gitdir:~/work/"]\n    [user]\n        name = ebosi\n        email = ebosi@corporate.com\n        signingkey = FEDCBA9876543210\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • .gitconfig是从上到下处理的,因此如果您想覆盖全局参数,请确保在默认配置之后导入新配置。以下内容(其中键按字母顺序排序)将不起作用

    \n\n
    [includeIf "gitdir:~/work/"]\n    path = ~/.gitconfig_work\n\n[user]\n    name = ebosi\n    email = me@private-email.com\n    signingkey = 0123456789ABCDEF \n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n