Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

executable file 82 lines (71 sloc) 2.483 kb
#!/bin/bash
#
# Usage: branch [branchname]
#
#
# Switch to an existing branch, or create a new local-only branch.
# Adds remote tracking if a remote branch with the same name exists,
# in any remote, preferring the "origin" master if there are duplicates.
#
# Executing without arguments prints all local & remote branches
#
remote="origin"
branch=$1
if [ -z $branch ]; then
echo -e "\nSwitch to or create a new branch:"
echo -e " $(basename $0) [name]"
echo -e "\nCurrent branches: "
branches="git branch -a -vv"
$branches
echo
exit 0
fi
local_branch_exists=$(git branch --no-color | egrep "$branch\$")
remote_branch_exists=$(git branch -r --no-color | egrep "$remote/$branch\$")
remotes=( $(git remote) )
remotes_with_branch=()
origin_has_branch=
for remote in "${remotes[@]}";
do
remote_branch_exists=$(git branch -r --no-color | egrep "$remote/$branch\$")
if [ "$remote_branch_exists" ] ; then
remotes_with_branch=("${remotes_with_branch[@]}" "$remote")
if [ "$remote" = "origin" ] ; then
origin_has_branch=1
fi
fi
done
if [ ${#remotes_with_branch[@]} -gt 0 ]; then
# if there's an origin remote with the named branch, use it
if [ "$origin_has_branch" = "1" ] ; then
remote=origin
else # track the first matching branch alphabetically
remote=${remotes[0]}
fi
remote_branch_exists="$remote/$branch"
fi
# If local exists already, switch to it
if [ -n "$local_branch_exists" ] && [ ! "$local_branch_exists" == '' ]; then
echo "Switching to existing local branch..."
git checkout $branch
# Track remote branch if not already
if [ -n "$remote_branch_exists" ] && [ ! "$remote_branch_exists" == '' ]; then
tracking=$(git branch -vv | grep "*" | awk '{ print $4 '})
# echo "Remote branch exists. Local branch is tracking: $tracking"
if [[ ! "$tracking" =~ "$remote" ]]; then
echo "Your local branch is not tracking the corresponding remote branch, fixing..."
git branch --set-upstream-to $branch $remote/$branch
fi
# else
# echo "Remote branch does not exist, not doing anything"
fi
# If remote exists, create a local branch that tracks the remote
elif [ -n "$remote_branch_exists" ] && [ ! "$remote_branch_exists" == '' ]; then
echo "Tracking existing remote branch '$remote_branch_exists'..."
git checkout -b $branch --track $remote/$branch
# Otherwise create a new local branch
else
echo "Creating new local branch..."
git checkout -b $branch --no-track
fi
exit 0
Jump to Line
Something went wrong with that request. Please try again.