Sync forked git repository

Here is a script to sync a forked (not mirrored) git repository. In my case I have new private branches I cannot push upstream, but I want the base branches to get synchronized with the upstream repository.

#!/bin/bash set -e # set -x UPSTREAM=$1 REMOTES=$(git remote -v) if [[ "$REMOTES" != *"$UPSTREAM"* ]]; then git remote add upstream $UPSTREAM fi git fetch git fetch upstream BRANCHES=$(git branch -a) REMOTES=(${BRANCHES// /}) ORIGIN=() UPSTREAM=() LOCAL=() for element in "${REMOTES[@]}" do if [[ "$element" == *"origin"* ]]; then ORIGIN+=(${element#"remotes/origin/"}) elif [[ "$element" == *"upstream"* ]]; then UPSTREAM+=(${element#"remotes/upstream/"}) else LOCAL+=(${element#"*"}) fi done for remote in "${UPSTREAM[@]}" do echo ${remote} echo "===========================================" if [[ " ${ORIGIN[@]} " =~ "${remote} " ]]; then echo "merging ${remote}:" if [[ " ${LOCAL[@]} " =~ " ${remote} " ]]; then git checkout ${remote} else git checkout -b ${remote} origin/${remote} fi git merge upstream/${remote} git push else echo "adding new branch ${remote}:" git checkout ${remote} git push --set-upstream origin ${remote} fi echo "" done

Usage – copy the script in your repository folder then

synch.sh ssh://upstream/remote/path

Leave a Reply

Your email address will not be published. Required fields are marked *