覆盖 git repo 中的默认 GPG 密钥

覆盖 git repo 中的默认 GPG 密钥

语境

在我的计算机上,我在 中设置了一个全局 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设置,基于项目的路径。

这很简单:

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

    touch ~/.gitconfig_work
    
  2. 编辑为定义“工作” git 配置

    [user]
        name = ebosi
        email = [email protected]
        signingkey = FEDCBA9876543210
    
  3. 加载此文件有条件的~/.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 
    

相关内容