git-checkout-scripton commit Make "git checkout" verify that the argument refers to a commit (714fff2)
   1#!/bin/sh
   2. git-sh-setup-script || die "Not a git archive"
   3
   4old=$(git-rev-parse HEAD)
   5new=
   6force=
   7branch=
   8while [ "$#" != "0" ]; do
   9    arg="$1"
  10    shift
  11    case "$arg" in
  12        "-f")
  13                force=1
  14                ;;
  15        *)
  16                rev=$(git-rev-parse --verify --revs-only "$arg^0") || exit
  17                if [ -z "$rev" ]; then
  18                        echo "unknown flag $arg"
  19                        exit 1
  20                fi
  21                if [ "$new" ]; then
  22                        echo "Multiple revisions?"
  23                        exit 1
  24                fi
  25                new="$rev"
  26                if [ -f "$GIT_DIR/refs/heads/$arg" ]; then
  27                        branch="$arg"
  28                fi
  29                ;;
  30    esac
  31    i=$(($i+1))
  32done
  33[ -z "$new" ] && new=$old
  34
  35if [ "$force" ]
  36then
  37    git-read-tree --reset $new &&
  38        git-checkout-cache -q -f -u -a
  39else
  40    git-read-tree -m -u $old $new
  41fi
  42
  43# 
  44# Switch the HEAD pointer to the new branch if it we
  45# checked out a branch head, and remove any potential
  46# old MERGE_HEAD's (subsequent commits will clearly not
  47# be based on them, since we re-set the index)
  48#
  49if [ "$?" -eq 0 ]; then
  50        [ "$branch" ] && ln -sf "refs/heads/$branch" "$GIT_DIR/HEAD"
  51        rm -f "$GIT_DIR/MERGE_HEAD"
  52fi