summaryrefslogtreecommitdiff
path: root/git-checkout.sh
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-12-22 22:37:50 -0800
committerJunio C Hamano <junkio@cox.net>2005-12-22 23:16:55 -0800
commit104f3e03c03a83617bac9d120b5e536c5f29d9ef (patch)
treea1cbb47e5d080112dc5a6f71d54b934f7d22fd78 /git-checkout.sh
parent797bd6f490c91c07986382b9f268e0df712cb246 (diff)
downloadgit-104f3e03c03a83617bac9d120b5e536c5f29d9ef.tar.gz
checkout: sometimes work from a subdirectory.
git-checkout does two very different things, and what they should do when run from subdirectory are quite different. It does not make any sense to run the one that switches the current head from anywhere other than the toplevel: git-checkout [-f] <branch> git-checkout [-b <branch>] <committish> We could of course chdir to top and do the whole-tree checkout in git-checkout, but the point is the operation does not make sense on a partial tree. The whole tree is checked out. The other form is to update the index file and working tree file selectively: git-checkout <treeish> <file>... ;# out of tree to index and file git-checkout -- <file>... ;# out of index to file This form _does_ make sense to run from subdirectory; and I myself often wish we supported this. So here is a patch to do both. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'git-checkout.sh')
-rwxr-xr-xgit-checkout.sh9
1 files changed, 9 insertions, 0 deletions
diff --git a/git-checkout.sh b/git-checkout.sh
index 36308d22c6..1219ea0b0e 100755
--- a/git-checkout.sh
+++ b/git-checkout.sh
@@ -1,6 +1,7 @@
#!/bin/sh
USAGE='[-f] [-b <new_branch>] [<branch>] [<paths>...]'
+SUBDIRECTORY_OK=Sometimes
. git-sh-setup
old=$(git-rev-parse HEAD)
@@ -95,6 +96,14 @@ else
fi
fi
+# We are switching branches and checking out trees, so
+# we *NEED* to be at the toplevel.
+cdup=$(git-rev-parse --show-cdup)
+if test ! -z "$cdup"
+then
+ cd "$cdup"
+fi
+
[ -z "$new" ] && new=$old
# If we don't have an old branch that we're switching to,