#!/bin/sh . git-sh-setup-script || die "Not a git archive" old=$(git-rev-parse HEAD) new= force= branch= newbranch= while [ "$#" != "0" ]; do arg="$1" shift case "$arg" in "-b") newbranch="$1" shift [ -z "$newbranch" ] && die "git checkout: -b needs a branch name" [ -e "$GIT_DIR/refs/heads/$newbranch" ] && die "git checkout: branch $newbranch already exists" ;; "-f") force=1 ;; *) rev=$(git-rev-parse --verify "$arg^0") || exit if [ -z "$rev" ]; then echo "unknown flag $arg" exit 1 fi if [ "$new" ]; then echo "Multiple revisions?" exit 1 fi new="$rev" if [ -f "$GIT_DIR/refs/heads/$arg" ]; then branch="$arg" fi ;; esac i=$(($i+1)) done [ -z "$new" ] && new=$old # # If we don't have an old branch that we're switching to, # and we don't have a new branch name for the target we # are switching to, then we'd better just be checking out # what we already had # [ -z "$branch$newbranch" ] && [ "$new" != "$old" ] && die "git checkout: you need to specify a new branch name" if [ "$force" ] then git-read-tree --reset $new && git-checkout-cache -q -f -u -a else git-read-tree -m -u $old $new fi # # Switch the HEAD pointer to the new branch if it we # checked out a branch head, and remove any potential # old MERGE_HEAD's (subsequent commits will clearly not # be based on them, since we re-set the index) # if [ "$?" -eq 0 ]; then if [ "$newbranch" ]; then echo $new > "$GIT_DIR/refs/heads/$newbranch" branch="$newbranch" fi [ "$branch" ] && ln -sf "refs/heads/$branch" "$GIT_DIR/HEAD" rm -f "$GIT_DIR/MERGE_HEAD" else exit 1 fi