Using multiple GitHub accounts on one computer
Published: 2022-06-09 18:11:30

For this article I will use example of two accounts but it could very easily we expanded to multiple accounts.

First step is to create ssh-keys which could be done by the following commands:

```
ssh-keygen -t ed25519 -C "your_email@personal.com"
ssh-keygen -t ed25519 -C "your_email@work.com"
```
Note that `-C "your_email@personal.com"` will just add your email address at the end or the public key. `-C` option is to add comment at the end of the public key. So it could be anything you like.

Also note `-t ed25519` is specifying algorithm used to create the public and private keys. `ed25519` or Edwards-curve Digital Signature Algorithm is the 4th generation protocol for ssh key generation. If you don't set this option it will use the RSA algorithm by default to generate the key pairs.  

Now you will be prompted with:

```
Enter file in which to save the key (/home/{username}/.ssh/id_ed25519):
```
I would recommend you give a personalized name with location like `/home/{username}/.ssh/personal` and same goes for work one `/home/{username}/.ssh/work`
In your home directory you will see .ssh folder which should have `personal.pub` and `work.pub` which contains your public key and `personal`,`work` which contains your private key.

Now you need to start the ssh-agent using, the following command:

```
eval $(ssh-agent)
```
Note that we do `eval` because ssh-agent once outputs bunch of variables that could be set as environment variables. This just makes life easier so its a good practise. You can check this [link](https://unix.stackexchange.com/questions/351725/why-eval-the-output-of-ssh-agent?newreg=b48571273c4e4abeb5c432b358b60ddc) for more reference.

Now you could add the private keys to the ssh-agent, so that you don't have to put your passphrase every-time you do anything.

```
ssh-add ~/.ssh/personal
ssh-add ~/.ssh/work
```
You will be prompted to enter your passphrase for this. You can check if your keys are added by doing
```
ssh-add -l
```
Now you need to add the public keys to your GitHub accounts. This is a good [link](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account) for reference.
Go to GitHub can click on your profile on top right hand corner and got to settings.
There if you scroll down you will see an option `New SSH key`. Click that green button and add the appropriate key. You can copy the key by 

```
pbcopy < ~/.ssh/personal.pub
```
You have copied the contents of the `personal.pub` file. You can paste this to your GitHub account as new ssh-key. You can give it a Title in GitHub to better remember it.

Now just hit `Add SSH key` button and finally you have added the public key to your GitHub. Assuming that you have added both the keys to the respective account let's set up the ssh and git configs to work with both the accounts.

Go to `.ssh` in your home directory. Check if you have an existing `config` file. If you don't have one create one. You need to create one that looks like
```
# Default github account: work-account
Host github.work.com
   HostName github.work.com
   IdentityFile ~/.ssh/work
   IdentitiesOnly yes
   
# Other github account: personal-account
Host github.com
   HostName github.com
   IdentityFile ~/.ssh/personal
   IdentitiesOnly yes
```

Note that the lines starting with `#` are just comments and does not affect the config. The flag used `IdentitiesOnly` is used for ssh-agent to point at the specific key provided by `IdentityFile`.

Now we want to separate our git configs. Here you could choose your style. For me I like to use my work account everywhere except the `~/personal` folder. Here I am going to use a minimal `.gitconfig` to avoid confusion but go fancy with it.

In you home dir if you don't have one already create a `.gitconfig` file.

```
[user]
	email = your_email@work.com
	name = Your Name


[includeIf "gitdir:~/personal/"]
	path = ~/personal/.gitconfig-pers
```
In this file we are setting your default Name, Email and setting a condition that if you are in `~/personal/` it will use load gitconfig from `~/personal/.gitconfig-pers`.

Now we have to create the `~/personal/.gitconfig-pers`.
```
[user]
	email = your_email@personal.com	
        name = Your Name
```
This file will override the email and name when in `~/personal`. 
Note that the changes will apply to the directories inside the `~/personal/`. Which means to check if you config worked create a test folder like so `~/personal/test`.
Here if you type 
```
git config --get user.email
```
You will get your personal email. Except for sub-folders inside `~/personal/` you will get your work email when running the same command.

Enjoy your new setup!