Git Add Another Remote to an Existing Repository

From NovaOrdis Knowledge Base
Jump to: navigation, search

Internal

Overview

This article describes the procedure of adding a second remote to an existing repository. A practical situation when we would need something like this is when we developed an an application in an internal repository - for example a Gogs instance deployed within an OpenShift cluster - and we want to share the example in GitHub, while maintaining the internal repository fully operable. We start from a local repository fully synchronized with the Gogs repository:

git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
git remote -v show
origin	https://gogs-cicd.apps.openshift.novaordis.io/gogs/novaordis-session-servlet.git (fetch)
origin	https://gogs-cicd.apps.openshift.novaordis.io/gogs/novaordis-session-servlet.git (push)

For the sake of simplicity, we will use just one branch ("master"), which will have a corresponding "master" [Git_Concepts#Remote-Tracking_Branch|remote-tracking branch]] in each remote repository.

Procedure

Create the Second Repository

Use GitHub's UI. For consistency, use the same repository name, though it is not necessary.

Add the Second Remote

From the local repository, add the GitHub remote:

git remote add github git@github.com:NovaOrdis/novaordis-session-servlet.git

The remote is immediately added:

git remote -v show
github	git@github.com:NovaOrdis/novaordis-session-servlet.git (fetch)
github	git@github.com:NovaOrdis/novaordis-session-servlet.git (push)
origin	https://gogs-cicd.apps.openshift.novaordis.io/gogs/novaordis-session-servlet.git (fetch)
origin	https://gogs-cicd.apps.openshift.novaordis.io/gogs/novaordis-session-servlet.git (push)

and .git/config is updated accordingly

...
[remote "github"]
       url = git@github.com:NovaOrdis/novaordis-session-servlet.git
       fetch = +refs/heads/*:refs/remotes/github/*
...

The second remote-tracking branch is automatically setup:

 git branch -a
 * master
   remotes/github/master
   remotes/origin/master

State

At this point, the master branch's default remote is origin:/master:

[branch "master"]
     remote = origin
     merge = refs/heads/master

Merge a Change Introduced by the Origin

git pull

Push a Change to Origin

git push

Merge a Change Introduced on the Second Remote

git pull github master

The second remote ("github") has to be specified. Also, because the "master" branch is configured with the "origin" default remote, we also need to explicitly specify the second remote branch we want to pull ("master").

Push a Change to the Second Remote

git push github