read

If you have a personal account and a work account, then it gets more tedious to use both on the same computer. Here is a step-by-step guide on how to set them up.

Step 1. Generate SSH key for each account

Refer to Github’s instructions on how to generate your SSH key and adding it to Github.

In essence, you want to generate for all your accounts and specify where to keep the keys. We name it personal and work.

ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/personal
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/work

The corresponding public keys (personal.pub and work.pub) will be created.

You will also want ssh-agent to save your passphrase:

eval "$(ssh-agent -s)"
ssh-add -K ~/.ssh/personal
ssh-add -K ~/.ssh/work

Step 2. SSH config

In your ~/.ssh/config file:

Host work
   HostName github.com
   AddKeysToAgent yes
   UseKeychain yes
   IdentityFile ~/.ssh/work

Host personal
   HostName github.com
   AddKeysToAgent yes
   UseKeychain yes
   IdentityFile ~/.ssh/personal

Test that the right github user is being connected to with ssh -T git@work and ssh -T git@personal.

Step 3. Git usage

With that set up, you need to change the remotes URL. Instead of github.com, you have to replace with either work or personal.

Your personal ones look like this when you run git remote -v:

origin	git@personal:casualhacker/awesome_repo.git (fetch)
origin	git@personal:casualhacker/awesome_repo.git (push)

Similarly, for work ones:

origin	git@work:hardworker/awesome_repo.git (fetch)
origin	git@work:hardworker/awesome_repo.git (push)

If it is not, you will want to change it with eg. git remote set-url git@work:hardworker/awesome_repo.git. Of course, git clone has to use the same URL.

Step 4. Customize gitconfig

Gitconfigs can have different “levels” (system, global, local), and they will overide previous level.

Assuming the “personal” account is the default, we can set in ~/.gitconfig (the global level), and then specify an alternate gitconfig for “work”. In it, we can customize the “email” and “name” that are used in a commit.

# Personal account as default
[user]
  email = [email protected]
  name = John Doe

# Work account in ~/work
[includeIf "gitdir:~/work/**"]
  path = "~/work/.gitconfig"

As you can see in the includeIf section, we specify a path to another gitconfig. This gitconfig will only be used if the repo is in the “work” directory (or any nested subdirectories).

In the “work” gitconfig:

# Work account
[user]
  email = [email protected]
  name = John Doe

You can check by running git config github.email in different places.


Image

@samwize

¯\_(ツ)_/¯

Back to Home