1#!/bin/sh 2. git-sh-setup-script|| die "Not a git archive" 3 4old=$(git-rev-parse HEAD) 5new= 6force= 7branch= 8newbranch= 9while["$#"!="0"];do 10 arg="$1" 11shift 12case"$arg"in 13"-b") 14 newbranch="$1" 15shift 16[-z"$newbranch"] && 17 die "git checkout: -b needs a branch name" 18[-e"$GIT_DIR/refs/heads/$newbranch"] && 19 die "git checkout: branch$newbranchalready exists" 20;; 21"-f") 22 force=1 23;; 24*) 25rev=$(git-rev-parse --verify --revs-only "$arg^0")||exit 26if[-z"$rev"];then 27echo"unknown flag$arg" 28exit1 29fi 30if["$new"];then 31echo"Multiple revisions?" 32exit1 33fi 34 new="$rev" 35if[-f"$GIT_DIR/refs/heads/$arg"];then 36 branch="$arg" 37fi 38;; 39esac 40 i=$(($i+1)) 41done 42[-z"$new"] && new=$old 43 44# 45# If we don't have an old branch that we're switching to, 46# and we don't have a new branch name for the target we 47# are switching to, then we'd better just be checking out 48# what we already had 49# 50[-z"$branch$newbranch"] && 51["$new"!="$old"] && 52 die "git checkout: you need to specify a new branch name" 53 54if["$force"] 55then 56 git-read-tree --reset$new&& 57 git-checkout-cache -q -f -u -a 58else 59 git-read-tree -m -u$old $new 60fi 61 62# 63# Switch the HEAD pointer to the new branch if it we 64# checked out a branch head, and remove any potential 65# old MERGE_HEAD's (subsequent commits will clearly not 66# be based on them, since we re-set the index) 67# 68if["$?"-eq0];then 69if["$newbranch"];then 70echo$new>"$GIT_DIR/refs/heads/$newbranch" 71 branch="$newbranch" 72fi 73["$branch"] &&ln-sf"refs/heads/$branch""$GIT_DIR/HEAD" 74rm-f"$GIT_DIR/MERGE_HEAD" 75fi