checkout: sometimes work from a subdirectory.
authorJunio C Hamano <junkio@cox.net>
Fri, 23 Dec 2005 06:37:50 +0000 (22:37 -0800)
committerJunio C Hamano <junkio@cox.net>
Fri, 23 Dec 2005 07:16:55 +0000 (23:16 -0800)
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>
git-checkout.sh
index 36308d22c6a72b9ad53ced60bd3c70a2e17520b6..1219ea0b0e837b0cdd68fa909cd5151273dd70cf 100755 (executable)
@@ -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,