The problem
Assume that you had a repo that was hosted on github, and you decided that for some reason you would like to have a copy of your repo on gitlab as well. Perhaps the obvious solution would be to add another remote to your git config.
git remote add gitlab git@gitlab.com/username/my-repo.git
Pushing to both repos would then be achieved as follows:
git push origin main
git push gitlab main
Remembering to run both these commands every time you wanted to push your changes seems like a tall ask. The good new is that you can get the desired behaviour with just a single command that's likely already part of your muscle-memory:
git push origin main
The solution
A good place to start implementing our solution to this problem would be to check for existing remotes.
git remote -v
The above command lists out our fetch and push remotes, which may look something like this:
origin git@github.com:username/my-repo.git (fetch)
origin git@github.com:username/my-repo.git (push)
For the superstitious amongst us, you can optionally clear and re-add the origin remote.
git remote remove origin
git remote add origin git@github.com:username/my-repo.git
We now have one push and one pull URL. The solution to our problem lies in setting a second push URL as shown:
git remote set-url --add --push origin git@gitlab.com:username/my-repo.git
To wrap up, we then set the upstream branch of our choosing (main in this case).
git fetch origin main
git branch --set-upstream-to origin/main
From now on, whenever we run git push origin main, git will push our changes to both remote repositories (github and gitlab). Fetching or pulling changes from origin will always refer to just the one repo (github).
Bonus points
As a final touch, we can give both of our repo hosts a unique name in case we ever need to explicitly push or fetch from a particular one.
git remote add github git@github.com:username/my-repo.git
git remote add gitlab git@gitlab.com:username/my-repo.git
Once this is done, listing our remotes with git remote -v gives the following output:
github git@github.com:username/my-repo.git (fetch)
github git@github.com:username/my-repo.git (push)
gitlab git@gitlab.com:username/my-repo.git (fetch)
gitlab git@gitlab.com:username/my-repo.git (push)
origin git@github.com:username/my-repo.git (fetch)
origin git@github.com:username/my-repo.git (push)
origin git@gitlab.com:username/my-repo.git (push)
Top comments (0)