Skip to content

Instantly share code, notes, and snippets.

@rahularity
Last active December 26, 2024 12:51
Show Gist options
  • Save rahularity/86da20fe3858e6b311de068201d279e3 to your computer and use it in GitHub Desktop.
Save rahularity/86da20fe3858e6b311de068201d279e3 to your computer and use it in GitHub Desktop.
How To Work With Multiple Github Accounts on your PC

How To Work With Multiple Github Accounts on a single Machine

Let suppose I have two github accounts, https://github.com/rahul-office and https://github.com/rahul-personal. Now i want to setup my mac to easily talk to both the github accounts.

NOTE: This logic can be extended to more than two accounts also. :)

The setup can be done in 5 easy steps:

Steps:

  • Step 1 : Create SSH keys for all accounts
  • Step 2 : Add SSH keys to SSH Agent
  • Step 3 : Add SSH public key to the Github
  • Step 4 : Create a Config File and Make Host Entries
  • Step 5 : Cloning GitHub repositories using different accounts

Step 1

Create SSH keys for all accounts

First make sure your current directory is your .ssh folder.

     $ cd ~/.ssh

Syntax for generating unique ssh key for ann account is:

     ssh-keygen -t rsa -C "your-email-address" -f "github-username"

here,

-C stands for comment to help identify your ssh key

-f stands for the file name where your ssh key get saved

Now generating SSH keys for my two accounts

     ssh-keygen -t rsa -C "my_office_email@gmail.com" -f "github-rahul-office"
     ssh-keygen -t rsa -C "my_personal_email@gmail.com" -f "github-rahul-personal"

Notice here rahul-office and rahul-work are the username of my github accounts corresponding to my_office_email@gmail.com and my_personal_email@gmail.com email ids respectively.

After entering the command the terminal will ask for passphrase, leave it empty and proceed.

Passphrase Image

Now after adding keys , in your .ssh folder, a public key and a private will get generated.

The public key will have an extention .pub and private key will be there without any extention both having same name which you have passed after -f option in the above command. (in my case github-rahul-office and github-rahu-personal)

Added Key Image


Step 2

Add SSH keys to SSH Agent

Now we have the keys but it cannot be used until we add them to the SSH Agent.

     ssh-add -K ~/.ssh/github-rahul-office
     ssh-add -K ~/.ssh/github-rahul-personal

You can read more about adding keys to SSH Agent here.


Step 3

Add SSH public key to the Github

For the next step we need to add our public key (that we have generated in our previous step) and add it to corresponding github accounts.

For doing this we need to:

1. Copy the public key

 We can copy the public key either by opening the github-rahul-office.pub file in vim and then copying the content of it.
     vim ~/.ssh/github-rahul-office.pub
     vim ~/.ssh/github-rahul-personal.pub

OR

We can directly copy the content of the public key file in the clipboard.

     pbcopy < ~/.ssh/github-rahul-office.pub
     pbcopy < ~/.ssh/github-rahul-personal.pub

2. Paste the public key on Github

  • Sign in to Github Account
  • Goto Settings > SSH and GPG keys > New SSH Key
  • Paste your copied public key and give it a Title of your choice.

OR


Step 4

Create a Config File and Make Host Entries

The ~/.ssh/config file allows us specify many config options for SSH.

If config file not already exists then create one (make sure you are in ~/.ssh directory)

     touch config

The commands below opens config in your default editor....Likely TextEdit, VS Code.

     open config

Now we need to add these lines to the file, each block corresponding to each account we created earlier.

     #rahul-office account
     Host github.com-rahul-office
          HostName github.com
          User git
          IdentityFile ~/.ssh/github-rahul-office

     #rahul-personal account
     Host github.com-rahul-personal
          HostName github.com
          User git
          IdentityFile ~/.ssh/github-rahul-personal

Step 5

Cloning GitHub repositories using different accounts

So we are done with our setups and now its time to see it in action. We will clone a repository using one of the account we have added.

Make a new project folder where you want to clone your repository and go to that directory from your terminal.

For Example: I am making a repository on my personal github account and naming it TestRepo Now for cloning the repo use the below command:

    git clone git@github.com-{your-username}:{owner-user-name}/{the-repo-name}.git

    [e.g.] git clone git@github.com-rahul-personal:rahul-personal/TestRepo.git

Finally

From now on, to ensure that our commits and pushes from each repository on the system uses the correct GitHub user — we will have to configure user.email and user.name in every repository freshly cloned or existing before.

To do this use the following commands.

     git config user.email "my_office_email@gmail.com"
     git config user.name "Rahul Pandey"
     
     git config user.email "my-personal-email@gmail.com"
     git config user.name "Rahul Pandey"

Pick the correct pair for your repository accordingly.

To push or pull to the correct account we need to add the remote origin to the project

     git remote add origin git@github.com-rahul-personal:rahul-personal
     
     git remote add origin git@github.com-rahul-office:rahul-office

Now you can use:

     git push
     
     git pull

P.S:
If this gist has been helpful to you, kindly consider leaving a star.
If you'd like, let's connect on LinkedIn and build a supportive community together.

@rahularity
Copy link
Author

On windows and from Powershell:

  • The flag -K when you add a new key is deprecated. Just do: ssh-add <dir/keyname>

  • The directory must be complete as well (from C:/Users...), it does not work with ~/

  • If you are having trouble when adding the keys because it says that the directory is not found, try this:
    In PowerShell and as admin do:

    get-service ssh-agent // this should be stopped
    get-service ssh-agent | select startType // this should be disabled

    to enable do:

    get-service -name ssh-agent | set-service -startupType Manual

    The Last command should get you up and running, now you can try to add the keys as I say at the begging, and problem solved!

Thank You @ZornStolz for your valuable comment.
Can you please add the same comment on my medium post so it can help others too. (https://medium.com/@rprahulpandey21/how-to-work-with-multiple-github-accounts-on-a-single-machine-336b845fe6ce)
Thank you in advance.

@RshStone
Copy link

Thank you

@yosoul93
Copy link

yosoul93 commented Dec 8, 2022

Nice tutorial, thumbs up!

@PaulBoye-py
Copy link

Thank you

@chetankumar81
Copy link

Nice tutorial, thank you so much!!!!

@iankingcoop
Copy link

I try this once a year and it never works, still can't get it. Permission error. Nothing else in my config file except what is shown here.

@iankingcoop
Copy link

NVM I got it, had to git remote set-url origin instead of adding it, since when a repo is cloned it automatically adds a remote origin.

@tareknatsheh
Copy link

@ZornStolz dude.... THANK YOU!

@ysmjp
Copy link

ysmjp commented Jan 10, 2023

thank you!

@leonardoderks
Copy link

Thank you!

@pistolpack
Copy link

ah thanks a lot

@WIBRC45920
Copy link

thanks a lot

@okumujustine
Copy link

Thank you for this

@dhirajpatra
Copy link

Thank you

@onamkrverma
Copy link

onamkrverma commented Feb 3, 2023

Thanks Rahul for step by step explanations
I want to add something in it after created two different ssh key and config when you are going do first commit in any repo
then change to desire author details otherwise it will show default author in gitHub commit section

  • For set author details you can use below command

git commit --author="John Doe <john@doe.org>"

@viniciusnevescosta
Copy link

when I tried git push -u origin main in my second github account

this error message appears

ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

can you help me?

@viniciusnevescosta
Copy link

when I tried git push -u origin main in my second github account

this error message appears

ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

can you help me?

I managed to solve it, I added the following options manually in the .git/config file

[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	sshCommand = ssh -i ~/.ssh/github-[username]
[remote "origin"]
	url = git@github.com-[username]:[username]/backup-files.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main
[user]
	email = [useremail]
	name = [username]

@iancooper4321
Copy link

Can someone please help me figure out what is going wrong? I yet again am having trouble. I had this all set up, but now I am getting permission errors and git keeps trying to use my work user.

ERROR: Permission to iankingcoop/powder_alert.git denied to XXX_WORK_USER_XXXX.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

@VictoriousRaptor
Copy link

VictoriousRaptor commented Feb 8, 2023

Can someone please help me figure out what is going wrong? I yet again am having trouble. I had this all set up, but now I am getting permission errors and git keeps trying to use my work user.

ERROR: Permission to iankingcoop/powder_alert.git denied to XXX_WORK_USER_XXXX.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Set your remote url to like git@your-username:{owner-user-name}/{the-repo-name}.git. It works for me.

@iancooper4321
Copy link

Thanks for helping. I did get this to work.

setting the url to
git@github.com-<my_username>:{owner-user-name}/{the-repo-name}.git

This process is so painful in general. Adding the right URL, SSH forgetting certain keys, and needing to change the url so that it contains the hostname and not just @github.com.... so frustrating. I blame git.

@savaryna
Copy link

Hey! Having to deal with the same problem, inspired by posts like yours and tired of repeating the steps every time I want to add a new account or switch machines, I created this npm package @savaryna/git-add-account (maybe a bit too much I know), but it does all that automatically. Maybe some of you guys can try it out and let me know how did it work for you! 🙇

You can just run npx @savaryna/git-add-account, enter your details and done! 🌟

@ryan-bowers-vectorsolutions

This is awesome. This should be the defacto ssh tutorial on githubs help section. Works, (for me) and makes more sense than the other tutorials even for single accounts using ssh. Bookmarked this page under "This is the way (ssh github)"

@ivan-toriya
Copy link

@rahularity

-  ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
+  ssh-keygen -t ed25519 -C "your_email@example.com"

New recommended way by GitHub is to use ed25519 instead of rsa-4096.

@saadnvd1
Copy link

Thank you!

@saadnvd1
Copy link

I also realized that if you want to keep your personal as the default, you can change your ~/.ssh/config to resemble this:

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

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

@mahyar-osn
Copy link

This was great thank you!

@lannodev
Copy link

lannodev commented Mar 7, 2023

Thank you ;)

@ztaylor797
Copy link

Just dropping this here for anyone else that runs into it.

If your GitHub org has SSO enabled, there is an additional step that must be taken.
If not done, you will run into this error:

ERROR: The `Foo' organization has enabled or enforced SAML SSO. To access
this repository, you must use the HTTPS remote with a personal access token
or SSH with an SSH key and passphrase
that has been authorized for this organization. Visit
https://docs.github.com/articles/authenticating-to-a-github-organization-with-saml-single-sign-on/ for more information.

fatal: Could not read from remote repository.

Please make sure you have the correct access rights

Per the doc link above, you just need to go to your SSH keys page and click Configure SSO next to the SSH key you just added. Then select the proper Organization and click Authorize.

image

@zayedupal
Copy link

I was facing with user name issue and this video solved the problem:
https://www.youtube.com/watch?v=6lA0oPoFCAE&ab_channel=JcMiron

@danielbped
Copy link

awesome tutorial, thanks a lot!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment