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:
- 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
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
ssh-keygen -t rsa -C "[email protected]" -f "github-rahul-office"
ssh-keygen -t rsa -C "[email protected]" -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.
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)
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.
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
- Sign in to Github
- Paste this link in your browser (https://github.com/settings/keys) or click here
- Click on New SSH Key and paste your copied key.
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
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 [email protected]{your-username}:{owner-user-name}/{the-repo-name}.git
[e.g.] git clone [email protected]:rahul-personal/TestRepo.git
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 "[email protected]"
git config user.name "Rahul Pandey"
git config user.email "[email protected]"
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 [email protected]:rahul-personal
git remote add origin [email protected]: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.
This still requires you to clone your repository?
I have been struggling with this and tried some of these complicated solutions with ssh keys. Not sure if there is an advantage to those solutions but for me I did not want to have to clone my repository.
I found this solution (https://dev.to/hashcode01/add-a-second-remote-origin-to-git-35a7#:~:text=To%20add%20a%20second%20remote,remote%20origins%20for%20the%20repository.) to be the easiest where you just add a second remote and then push to both:
To add a second remote origin to Git and push changes to two repositories on GitHub, you can follow these steps:
Open your terminal or command prompt and navigate to the local Git repository that you want to push to two repositories. Use the git remote -v command to list the existing remote origins for the repository. You should see something like this:
Use the git remote add command to add a second remote origin to the repository. For example, if you want to add a remote origin named "second" with the URL https://github.com/username/second-repo.git, you can use the following command:
$ git remote add second https://github.com/username/second-repo.git
Use the git remote -v command again to confirm that the new remote origin has been added:
Make any changes to your local Git repository and commit them using the git commit command.
Use the git push command to push your changes to both remote origins. To push to both origins at once, you can use the --all option:
$ git push --all
This will push all branches to both remote origins. Alternatively, you can specify a specific branch to push to both origins: