X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=git-checkout.sh;h=aa724ac1a3859791187d257da6445d2b4adc1de8;hb=b63e99500137c913bd801a2f22b6cf88c63b95c5;hp=33f1e87c0c209b89eb785381db62d826818b602d;hpb=1a6f3999998a22325ff820bf8c840e3baf3d2281;p=git.git diff --git a/git-checkout.sh b/git-checkout.sh index 33f1e87c0..aa724ac1a 100755 --- a/git-checkout.sh +++ b/git-checkout.sh @@ -1,13 +1,23 @@ #!/bin/sh -USAGE='[-q] [-f] [-b ] [-m] [] [...]' +OPTIONS_KEEPDASHDASH=t +OPTIONS_SPEC="\ +git-branch [options] [] [...] +-- +b= create a new branch started at +l create the new branchs reflog +track tells if the new branch should track the remote branch +f proceed even if the index or working tree is not HEAD +m performa three-way merge on local modifications if needed +q,quiet be quiet +" SUBDIRECTORY_OK=Sometimes . git-sh-setup require_work_tree old_name=HEAD -old=$(git-rev-parse --verify $old_name 2>/dev/null) -oldbranch=$(git-symbolic-ref $old_name 2>/dev/null) +old=$(git rev-parse --verify $old_name 2>/dev/null) +oldbranch=$(git symbolic-ref $old_name 2>/dev/null) new= new_name= force= @@ -20,78 +30,67 @@ quiet= v=-v LF=' ' -while [ "$#" != "0" ]; do - arg="$1" - shift - case "$arg" in - "-b") - newbranch="$1" + +while test $# != 0; do + case "$1" in + -b) shift + newbranch="$1" [ -z "$newbranch" ] && die "git checkout: -b needs a branch name" - git-show-ref --verify --quiet -- "refs/heads/$newbranch" && + git show-ref --verify --quiet -- "refs/heads/$newbranch" && die "git checkout: branch $newbranch already exists" - git-check-ref-format "heads/$newbranch" || + git check-ref-format "heads/$newbranch" || die "git checkout: we do not like '$newbranch' as a branch name." ;; - "-l") + -l) newbranch_log=-l ;; - "--track"|"--no-track") - track="$arg" + --track|--no-track) + track="$1" ;; - "-f") + -f) force=1 ;; -m) merge=1 ;; - "-q") + -q|--quiet) quiet=1 v= ;; --) + shift break ;; - -*) - usage - ;; *) - if rev=$(git-rev-parse --verify "$arg^0" 2>/dev/null) - then - if [ -z "$rev" ]; then - echo "unknown flag $arg" - exit 1 - fi - new_name="$arg" - if git-show-ref --verify --quiet -- "refs/heads/$arg" - then - rev=$(git-rev-parse --verify "refs/heads/$arg^0") - branch="$arg" - fi - new="$rev" - elif rev=$(git-rev-parse --verify "$arg^{tree}" 2>/dev/null) - then - # checking out selected paths from a tree-ish. - new="$rev" - new_name="$arg^{tree}" - branch= - else - new= - new_name= - branch= - set x "$arg" "$@" - shift - fi - case "$1" in - --) - shift ;; - esac - break + usage ;; - esac + esac + shift done +arg="$1" +if rev=$(git rev-parse --verify "$arg^0" 2>/dev/null) +then + [ -z "$rev" ] && die "unknown flag $arg" + new_name="$arg" + if git show-ref --verify --quiet -- "refs/heads/$arg" + then + rev=$(git rev-parse --verify "refs/heads/$arg^0") + branch="$arg" + fi + new="$rev" + shift +elif rev=$(git rev-parse --verify "$arg^{tree}" 2>/dev/null) +then + # checking out selected paths from a tree-ish. + new="$rev" + new_name="$arg^{tree}" + shift +fi +[ "$1" = "--" ] && shift + case "$newbranch,$track" in ,--*) die "git checkout: --track and --no-track require -b" @@ -129,14 +128,21 @@ Did you intend to checkout '$@' which can not be resolved as commit?" # from a specific tree-ish; note that this is for # rescuing paths and is never meant to remove what # is not in the named tree-ish. - git-ls-tree --full-name -r "$new" "$@" | - git-update-index --index-info || exit $? + git ls-tree --full-name -r "$new" "$@" | + git update-index --index-info || exit $? fi # Make sure the request is about existing paths. - git-ls-files --error-unmatch -- "$@" >/dev/null || exit - git-ls-files -- "$@" | - git-checkout-index -f -u --stdin + git ls-files --full-name --error-unmatch -- "$@" >/dev/null || exit + git ls-files --full-name -- "$@" | + (cd_to_toplevel && git checkout-index -f -u --stdin) + + # Run a post-checkout hook -- the HEAD does not change so the + # current HEAD is passed in for both args + if test -x "$GIT_DIR"/hooks/post-checkout; then + "$GIT_DIR"/hooks/post-checkout $old $old 0 + fi + exit $? else # Make sure we did not fall back on $arg^{tree} codepath @@ -144,7 +150,7 @@ else # but switching branches. if test '' != "$new" then - git-rev-parse --verify "$new^{commit}" >/dev/null 2>&1 || + git rev-parse --verify "$new^{commit}" >/dev/null 2>&1 || die "Cannot switch branch to a non-commit." fi fi @@ -200,10 +206,10 @@ fi if [ "$force" ] then - git-read-tree $v --reset -u $new + git read-tree $v --reset -u $new else - git-update-index --refresh >/dev/null - merge_error=$(git-read-tree -m -u --exclude-per-directory=.gitignore $old $new 2>&1) || ( + git update-index --refresh >/dev/null + merge_error=$(git read-tree -m -u --exclude-per-directory=.gitignore $old $new 2>&1) || ( case "$merge" in '') echo >&2 "$merge_error" @@ -254,12 +260,13 @@ fi # if [ "$?" -eq 0 ]; then if [ "$newbranch" ]; then - git-branch $track $newbranch_log "$newbranch" "$new_name" || exit + git branch $track $newbranch_log "$newbranch" "$new_name" || exit branch="$newbranch" fi if test -n "$branch" then - GIT_DIR="$GIT_DIR" git-symbolic-ref -m "checkout: moving to $branch" HEAD "refs/heads/$branch" + old_branch_name=`expr "z$oldbranch" : 'zrefs/heads/\(.*\)'` + GIT_DIR="$GIT_DIR" git symbolic-ref -m "checkout: moving from $old_branch_name to $branch" HEAD "refs/heads/$branch" if test -n "$quiet" then true # nothing @@ -271,7 +278,7 @@ if [ "$?" -eq 0 ]; then fi elif test -n "$detached" then - git-update-ref --no-deref -m "checkout: moving to $arg" HEAD "$detached" || + git update-ref --no-deref -m "checkout: moving to $arg" HEAD "$detached" || die "Cannot detach HEAD" if test -n "$detach_warn" then @@ -283,3 +290,8 @@ if [ "$?" -eq 0 ]; then else exit 1 fi + +# Run a post-checkout hook +if test -x "$GIT_DIR"/hooks/post-checkout; then + "$GIT_DIR"/hooks/post-checkout $old $new 1 +fi