⚠️ This post is archived from my phlog in Gopherspace. Please read my post on the Gopher Protocol to get started!

If you use more than one GitHub account you may want a nice set up to make it easy to assign a specific user to a specific repo with ease. Here are some instructions for that, plus signing commits with GPG key.

SSH Key

Create the key, be sure to use a name like id_ed25519_username, it’s also recommended to set a passphrase for added security:

ssh-keygen -t ed25519 -C "you@example.org"

Add the key to your SSH agent:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_username

GitHub, Repo

Add the key to your GitHub account:

cat ~/.ssh/id_ed25519_username.pub

Copy the output to whatever the “new ssh key” dialog is in your GitHub profile.

Configure SSH for specific GitHub repos (you’ll need to change the repos use this) in ~/.ssh/config:

Host github.com-username
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_username

You can update the remote URL for a repo like this:

git remote set-url origin git@github.com-username:ghusername/repo.git

GPG Key

Generate the GPG key:

gpg --full-generate-key

Choose RSA with at least 4096 bits. Set expiration date (or leave it as 0 for no expiration). Enter name and email when prompted.

Before we go further, you may want to backup your public and private keys. First get the ID for your key.

gpg --list-secret-keys --keyid-format=long

Then you can do something like this:

gpg --armor --export somekeyhere > username_public_key.asc
gpg --armor --export-secret-keys somekeyhere > username_private_key.asc

Moving on, add the GPG key to GitHub (should be similar in the GitHub interface to adding a new SSH key):

gpg --armor --export somekeyhere

For these remaining configurations, I think there’s a better way to do this, but configure git to use the GPG key for a specific repo:

git config user.signingkey somekeyhere
git config commit.gpgsign true

Also, config git to use a specific username and email for this repo:

git config user.name "full name"
git config user.email "you@example.org"

You can make signed commits like this:

git commit -S -m "Test signed commit"

Git configuration per domain

This is a more maintainable approach to have defaults set per domain we have (matching our ~/.ssh/config domains, used in repos):

Create a ~/.gitconfig-username:

[user]
    name = Full Name
    email = user@example.org
    signingkey = somekeyhere
[commit]
    gpgsign = true

Update global git configuration (~/.gitconfig):

[includeIf "hasconfig:remote.*.url:git@github.com-username:*/**"]
    path = ~/.gitconfig-username

Check the applied settings in a repo that uses the domain github.com-username:

git config --get user.name
git config --get user.email
git config --get user.signingkey
git config --get commit.gpgsign

Original content in gopherspace: gopher://gopher.someodd.zip:70/0/phlog/git-multi-user.gopher.txt