I was in need of using different signing keys (but same mail address) and had a little adventure in the advanced Git documentation I’d like to share.


In your `~/.config/git/config`` remove the [user] section and add this instead:

[includeIf "hasconfig:remote.*.url:https://your-remote-url/**"]
    path = ~/.config/git/user_a

And in ~/.config/git/user_a use this:

[user]
    email = username@example.com
    name = User Name                                                                
    signingkey = the_16_digit_GPG_key_ID

Repeat as often as you need. Just add another includeIf section for each of your remote hosts.

You can also keep a “stub” user section in your ~/.config/git/config if you always use the same user name and mail address but want to use different keys.

[user]
    email = dirk@0x7be.de
    name = Dirk

In your includeIf’d files simply set the signingkey:

[user]                                                                          
    signingkey = the_16_digit_GPG_key_ID

Git automatically combines the two as needed.

A minimal working example:

File ~/.config/.git/config:

[user]
    email = username@example.com
    name = User Name

[commit]
    gpgsign = true

[tag]
    gpgsign = true

[includeIf "hasconfig:remote.*.url:https://hostname_A/**"]
    path = ~/.config/git/config-A

[includeIf "hasconfig:remote.*.url:https://hostname_B/**"]
    path = ~/.config/git/config-B

File ~/.config/git/config-A:

[user]                                                                          
    signingkey = 16_digit_key_id_used_for_a

File ~/.config/git/config-B:

[user]                                                                          
    signingkey = 16_digit_key_id_used_for_b

Now when you push commits or tags to hostname_A or hostname_B the correct key is used to sign those (in the example, using same name and mail address) without having to manually edit this for all your local repositories.