#!/bin/sh # git-publish-branch [-d] [branch] [repository] unset delete unset force if [ "$1" = "-d" ]; then delete=1 shift elif [ "$1" = "-f" ]; then force=1 shift fi unset branch unset remote if [ $# -eq 1 ]; then branch=$1 elif [ $# -eq 2 ]; then branch=$1 remote=$2 elif [ $# -gt 2 ]; then echo "Usage: $0 [branch] [repository]" >&2 exit 1 fi if [ -z "$branch" ]; then branch=$(git symbolic-ref HEAD) branch=${branch//refs\/heads\//} fi if [ -z "$remote" ]; then remote=origin fi local_ref=$(git show-ref "heads/$branch") remote_ref=$(git show-ref "remotes/$remote/$branch") remote_config=$(git config "branch.$branch.merge") if [ $delete ]; then # Delete the remote branch if [ -n "$remote_ref" ]; then git push "$remote" ":refs/heads/$branch" else echo "$remote has to remote branch $branch" >&2 fi # Remove local configs for remote branch if [ -n "$local_ref" ]; then git config --unset "branch.$branch.remote" git config --unset "branch.$branch.merge" git config --unset "branch.$branch" fi elif [ $force ]; then if [ -z "$local_ref" ]; then echo "no local branch $branch" >&2 exit 1 elif [ -z "$remote_ref" ]; then echo "$remote has no branch $branch" >&2 exit 1 elif [ -z "$remote_config" ]; then echo "local branch $branch is not a tracking branch" >&2 exit 1 fi # Delete the remote branch if [ -n "$remote_ref" ]; then git push "$remote" ":refs/heads/$branch" else echo "$remote has to remote branch $branch" >&2 fi # Push the new branch git push "$remote" "+$branch:refs/heads/$branch" else if [ -z "$local_ref" ]; then echo "no local branch $branch" >&2 exit 1 elif [ -n "$remote_ref" ]; then echo "$remote already has branch $branch" >&2 exit 1 elif [ -n "$remote_config" ]; then echo "local branch $branch is already a tracking branch" >&2 exit 1 fi git push "$remote" "$branch:refs/heads/$branch" git config "branch.$branch.remote" "$remote" git config "branch.$branch.merge" "refs/heads/$branch" fi