Merge branch 'fixes'
[git.git] / git-checkout.sh
index 4e7c57a..2c053a3 100755 (executable)
@@ -17,12 +17,15 @@ while [ "$#" != "0" ]; do
                        die "git checkout: -b needs a branch name"
                [ -e "$GIT_DIR/refs/heads/$newbranch" ] &&
                        die "git checkout: branch $newbranch already exists"
+               git-check-ref-format "heads/$newbranch" ||
+                       die "we do not like '$newbranch' as a branch name."
                ;;
        "-f")
                force=1
                ;;
        *)
-               rev=$(git-rev-parse --verify "$arg^0") || exit
+               rev=$(git-rev-parse --verify "$arg^0" 2>/dev/null) ||
+                       die "I don't know any '$arg'."
                if [ -z "$rev" ]; then
                        echo "unknown flag $arg"
                        exit 1
@@ -55,6 +58,7 @@ then
     git-read-tree --reset $new &&
        git-checkout-index -q -f -u -a
 else
+    git-update-index --refresh >/dev/null
     git-read-tree -m -u $old $new
 fi
 
@@ -69,7 +73,8 @@ if [ "$?" -eq 0 ]; then
                echo $new > "$GIT_DIR/refs/heads/$newbranch"
                branch="$newbranch"
        fi
-       [ "$branch" ] && ln -sf "refs/heads/$branch" "$GIT_DIR/HEAD"
+       [ "$branch" ] &&
+       GIT_DIR="$GIT_DIR" git-symbolic-ref HEAD "refs/heads/$branch"
        rm -f "$GIT_DIR/MERGE_HEAD"
 else
        exit 1