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