1#!/bin/sh 2 3USAGE='[(-d | -D) <branchname>] | [[-f] <branchname> [<start-point>]] | -r' 4LONG_USAGE='If no arguments, show available branches and mark current branch with a star. 5If one argument, create a new branch <branchname> based off of current HEAD. 6If two arguments, create a new branch <branchname> based off of <start-point>.' 7 8SUBDIRECTORY_OK='Yes' 9. git-sh-setup 10 11headref=$(git-symbolic-ref HEAD | sed -e 's|^refs/heads/||') 12 13delete_branch () { 14 option="$1" 15shift 16for branch_name 17do 18case",$headref,"in 19",$branch_name,") 20 die "Cannot delete the branch you are on.";; 21,,) 22 die "What branch are you on anyway?";; 23esac 24 branch=$(cat "$GIT_DIR/refs/heads/$branch_name")&& 25 branch=$(git-rev-parse --verify "$branch^0")|| 26 die "Seriously, what branch are you talking about?" 27case"$option"in 28-D) 29;; 30*) 31 mbs=$(git-merge-base -a "$branch" HEAD | tr '\012' ' ') 32case"$mbs"in 33*' '$branch' '*) 34# the merge base of branch and HEAD contains branch -- 35# which means that the HEAD contains everything in both. 36;; 37*) 38echo>&2"The branch '$branch_name' is not a strict subset of your current HEAD. 39If you are sure you want to delete it, run 'git branch -D$branch_name'." 40exit1 41;; 42esac 43;; 44esac 45rm-f"$GIT_DIR/refs/heads/$branch_name" 46echo"Deleted branch$branch_name." 47done 48exit0 49} 50 51ls_remote_branches () { 52 git-rev-parse --symbolic --all| 53sed-ne's|^refs/\(remotes/\)|\1|p'| 54sort 55} 56 57force= 58while case"$#,$1"in0,*)break;; *,-*) ;; *)break;;esac 59do 60case"$1"in 61-d|-D) 62 delete_branch "$@" 63exit 64;; 65-r) 66 ls_remote_branches 67exit 68;; 69-f) 70 force="$1" 71;; 72--) 73shift 74break 75;; 76-*) 77 usage 78;; 79esac 80shift 81done 82 83case"$#"in 840) 85 git-rev-parse --symbolic --branches| 86sort| 87whileread ref 88do 89iftest"$headref"="$ref" 90then 91 pfx='*' 92else 93 pfx=' ' 94fi 95echo"$pfx$ref" 96done 97exit0;; 981) 99head=HEAD ;; 1002) 101head="$2^0";; 102esac 103branchname="$1" 104 105rev=$(git-rev-parse --verify "$head")||exit 106 107git-check-ref-format"heads/$branchname"|| 108 die "we do not like '$branchname' as a branch name." 109 110if[-e"$GIT_DIR/refs/heads/$branchname"] 111then 112iftest''="$force" 113then 114 die "$branchnamealready exists." 115eliftest"$branchname"="$headref" 116then 117 die "cannot force-update the current branch." 118fi 119fi 120git update-ref"refs/heads/$branchname"$rev