Multiple GitHub Account Management

If you have multiple github accounts then you will very quickly become aware of an annoyance of having to manage your git config for each repository. If you don’t want to commit as the account configured in your global .gitconfig then you have to remember to set your username and email on each repository that you clone or create.

If you don’t become aware of this then you will quickly be searching StackOverflow for how to amend the last commit author.

Use a personal gitconfig

The way I have been managing this is by using the includeIf section within my .gitconfig file and if the path of the repository is in my personal projects directory to include an alternative gitconfig.

# If Path is personal projects then use personal gitconfig
# The /i makes the path case insensitive
[includeIf "gitdir/i:C://git/personal/"]
	path = ~/.gitconfig-personal

This tells git that if you’re directory is in the path defined in gitdir then to use the .gitconfig-personal file instead of the usual config file.

In your .gitconfig-personal folder add your personal details.

[user]
    name = Brett Miller
    email = brett@millerb.co.uk

The Downside

Using this method does not work so well if, like me, you use different SSH keys for accessing the two accounts then you also need to use an ssh config and when you clone a repository you have to change the URL e.g. when I clone a personal repository I have to change the remote URL to personal.github.com.

❯❯ cat ~/.ssh/config

# Github Personal account
  Host personal.github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_personal

# Github Work account
  Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_work

An Even Easier Way

So I stumbled upon a blog post a little while ago which showed an easier way to do this resulting in no longer requiring a different gitconfig for personal configuration. I have just changed workstations so decided that I would configure this properly.

After searching for about an hour for the blog post I finally found it or at least something that covered what I was looking for).

This uses the same includeIf that I was using before but makes it even easier!

cat ~/.gitconfig
[user]
    name = Brett Miller
    email = brett.miller@work.com

[core]
    sshCommand = "ssh -i ~/.ssh/id_rsa_work"

[init]
    defaultBranch = main

[includeIf "gitdir/i:C:/git/personal/"]
    [user]
        email = brett.miller@millerb.co.uk

    [core]
        sshCommand = "ssh -i ~/.ssh/id_personal"

This uses the core.sshCommand setting to specify my personal SSH key if I am within a git project in my personal directory.

Summary

I used to use SSH authentication for work and HTTPS for personal projects. When I changed laptops a while ago I switched to SSH for both accounts. Now that GitHub have deprecated the use of basic authentication for HTTPS auth, it makes SSH more appealing

Really pleased with this configuration as it has eliminated the need for an ssh config, a secondary gitconfig, I no longer have to change the remote repository URL or set user and email per repostory.

Now to figure out GPG signing on a per account basis 🙌

Comments