Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to update my fork to have the same branches and tags as the original repository on github?

Tags:

git

github

When you fork a repository on github your forked repo contains all branches and tags.

Over time these branches and tags gets outdated.

How does one as easy it is with fork make sure your fork has all branches and tags without having to reclone ?

i.e. a git magicpull --rebase upstream/* myremote/*

which would fetch all the branches and tags in upstream and make sure the same are present in myremote.

like image 453
Max Rydahl Andersen Avatar asked Apr 03 '13 05:04

Max Rydahl Andersen


People also ask

How do I sync forked with original repo?

To sync your forked repo with the parent or central repo on GitHub you: Create a pull request on GitHub.com to update your fork of the repository from the original repository, and. Run the git pull command in the terminal to update your local clone.


1 Answers

This assumes your "upstream" remote is named "origin" and you have your custom fork under your username (i.e. "maxandersen")

When you have your clone run the following one-liner (refresh of Track all remote git branches as local branches :

remote=origin ; for brname in `git branch -r | grep origin | grep -v master | grep -v HEAD | sed -e 's/.*\///g'`; do git branch --track $brname  $remote/$brname ; done 

This will setup tracking branches for all the branches found in the remote named 'origin'. If you already have a checkout with this branchname it will not change anything except ensure the tracking is in place.

(Optional) Now ensure all your branches are uptodate (useful if you have already branches checked out):

git pull --rebase --all 

Now with all branches setup for tracking and uptodate push branches and tags to your remote (replace 'maxandersen' with your remote name):

git push --all maxandersen git push --tags maxandersen 

After this your fork is in sync.

The following script does all this including asking for confirmation:

## Checkout all branches from remote as tracking branches. Based on    https://stackoverflow.com/questions/379081/track-all-remote-git-branches-as-local-branches/6300386#6300386  UPSTREAM=$1 MYREPO=$2  usage() {    echo "Usage:"    echo "$0 <upstream-remote> <target-remote>"    echo ""    echo "Example which ensures remote named 'maxandersen' have all the same branches and tags as 'origin'"    echo "$0 origin maxandersen"    exit 1 }  if [ -z "$UPSTREAM" ] then  echo Missing upstream remote name.  usage fi  if [ -z "$MYREPO" ] then  echo Missing target remote name.   usage fi  read -p "1. This will setup '$MYREPO' to track all branches in '$UPSTREAM' - Are you sure ?" -n 1 -r  if [[ $REPLY =~ ^[Yy]$ ]] then  for brname in `git branch -r | grep "$UPSTREAM" | grep -v master | grep -v HEAD | sed -e 's/.*\///g'`; do git branch --track $brname  $UPSTREAM/$brname ; done fi  read -p "2. This will push all local branches and tags into '$MYREPO' - Are you sure ?" -n 1 -r  if [[ $REPLY =~ ^[Yy]$ ]] then  git push --all $MYREPO  git push --tags $MYREPO fi 

Save it as 'updateallbranchestags.sh' and execute it with:

sh updateallbranches.sh origin maxandersen 

And all branches/tags from 'origin' will be made available in remote named 'maxandersen'

like image 128
Max Rydahl Andersen Avatar answered Oct 01 '22 02:10

Max Rydahl Andersen