1#!/bin/sh 2 3USAGE='[(-d | -D) <branchname>] | [[-f] <branchname> [<start-point>]]' 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 --all| 86sed-ne's|^refs/heads/||p'| 87sort| 88whileread ref 89do 90iftest"$headref"="$ref" 91then 92 pfx='*' 93else 94 pfx=' ' 95fi 96echo"$pfx$ref" 97done 98exit0;; 991) 100head=HEAD ;; 1012) 102head="$2^0";; 103esac 104branchname="$1" 105 106rev=$(git-rev-parse --verify "$head")||exit 107 108git-check-ref-format"heads/$branchname"|| 109 die "we do not like '$branchname' as a branch name." 110 111if[-e"$GIT_DIR/refs/heads/$branchname"] 112then 113iftest''="$force" 114then 115 die "$branchnamealready exists." 116eliftest"$branchname"="$headref" 117then 118 die "cannot force-update the current branch." 119fi 120fi 121git update-ref"refs/heads/$branchname"$rev