| #!/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" |
| fi |