git-checkout-scripton commit Make "git checkout" create new branches on demand (91dcdfd)
   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"
  11    shift
  12    case "$arg" in
  13        "-b")
  14                newbranch="$1"
  15                shift
  16                [ -z "$newbranch" ] &&
  17                        die "git checkout: -b needs a branch name"
  18                [ -e "$GIT_DIR/refs/heads/$newbranch" ] &&
  19                        die "git checkout: branch $newbranch already exists"
  20                ;;
  21        "-f")
  22                force=1
  23                ;;
  24        *)
  25                rev=$(git-rev-parse --verify --revs-only "$arg^0") || exit
  26                if [ -z "$rev" ]; then
  27                        echo "unknown flag $arg"
  28                        exit 1
  29                fi
  30                if [ "$new" ]; then
  31                        echo "Multiple revisions?"
  32                        exit 1
  33                fi
  34                new="$rev"
  35                if [ -f "$GIT_DIR/refs/heads/$arg" ]; then
  36                        branch="$arg"
  37                fi
  38                ;;
  39    esac
  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 [ "$?" -eq 0 ]; then
  69        if [ "$newbranch" ]; then
  70                echo $new > "$GIT_DIR/refs/heads/$newbranch"
  71                branch="$newbranch"
  72        fi
  73        [ "$branch" ] && ln -sf "refs/heads/$branch" "$GIT_DIR/HEAD"
  74        rm -f "$GIT_DIR/MERGE_HEAD"
  75fi