git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <junkio@cox.net>
To: Linus Torvalds <torvalds@osdl.org>
Cc: git@vger.kernel.org
Subject: Re: git-checkout-index, flag ordering and --prefix kludgy handling
Date: Mon, 17 Oct 2005 19:27:50 -0700	[thread overview]
Message-ID: <7vmzl7tv89.fsf@assigned-by-dhcp.cox.net> (raw)
In-Reply-To: Pine.LNX.4.64.0510171814430.3369@g5.osdl.org

Linus Torvalds <torvalds@osdl.org> writes:

> Btw, I'd really like a "git checkout" that can do the per-file thing, 
> instead of always using the equivalent of git-checkout-index with "-a".
>
> It's actually one of the few places where I still use the raw git 
> commands, doing things like
>
> 	git-checkout-index -u -f filename
>
> and I suspect that a lot of people would prefer that
>
> 	git checkout filename
>
> would just do that. Instead, we error out ("no such branch"). Which 
> isn't even what I want, and almost certainly not what most CVS users want 
> (they're used to checking out individual files).

Yes, it has been on the TODO list for quite some time.

One reason I have not done nor said much about this was because
I've been thinking about making the branch/refname more explicit
on our command line.

Currently, we tell 'git-rev-parse' to tell refnames and other
non-flag parameters apart, which in practice does not result in
much confusion, but I think it is not quite right.

I used to have a local branch, only to fetch updates from
paulus, and naturally the branch was called 'gitk'.  But we have
a file called gitk sitting at the top level of the tree, and
'git diff gitk gitk' was not really working as well as I would
have liked ('git diff heads/gitk gitk' should have worked, but I
do not think it did).  Since then this forced me to rename the
branch to 'paulus' X-<.

On the other hand, if there is no ambiguity, I do not think
forcing people to always spell out '-r' like CVS or SVN do
is not necessary:

        $ git diff -r master^^ -r master ;# two commits
        $ git diff -r v0.99.8		 ;# changes since that tag
	$ git checkout -r master
        $ git checkout -r master $filename

This checkout optionally taking filename is introducing one more
ambiguity, and I was reluctant to do so before deciding what to
do about other commands.

Another thing I was thinking was that this might be better
implemented as a separate command that can revert the working
tree file to an artibtrary tree-ish as well.  So:

	$ git xxxxxx --index file1 file2...

would do your 'git-checkout-index -f -u file1 file2...', while

	$ git xxxxxx file1 file2...

would do an equivalent of:

	git ls-tree HEAD file1 file2... |
        sed -e 's/^\([0-7]*\) [^ ]* /\1 /' |
        git-update-index --index-info
        git-checkout-index -f -u file1 file2...

or even:

	$ git xxxxxx HEAD^^ file1 file2...

would give you back file1 and file2 from two revs back.  Of
course, to avoid ambiguities, the last one will be spelled as 

	$ git xxxxxx -r HEAD^^ file1 file2...

if people find that a separate command is cleaner.

Anyway, in the meantime...

 ------------
[PATCH] checking out individual files from index.

'git checkout filename1 filename2...' can be used to revert the
changes you made to files in the working tree to the version
recorded in the index file.

Signed-off-by: Signed-off-by: Junio C Hamano <junkio@cox.net>

---

diff --git a/git-checkout.sh b/git-checkout.sh
index 2c053a3..6af71a2 100755
--- a/git-checkout.sh
+++ b/git-checkout.sh
@@ -6,6 +6,7 @@ new=
 force=
 branch=
 newbranch=
+
 while [ "$#" != "0" ]; do
     arg="$1"
     shift
@@ -24,19 +25,28 @@ while [ "$#" != "0" ]; do
 		force=1
 		;;
 	*)
-		rev=$(git-rev-parse --verify "$arg^0" 2>/dev/null) ||
-			die "I don't know any '$arg'."
-		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"
+		if rev=$(git-rev-parse --verify "$arg^0" 2>/dev/null)
+		then
+			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
+		else
+			# check out individual files from index
+			if test "$new" || test "$newbranch"
+			then
+				die "checkout and switch tree?"
+			fi
+			git-checkout-index -f -u "$arg" "$@"
+			exit $?
 		fi
 		;;
     esac

Compilation finished at Mon Oct 17 19:08:29

  reply	other threads:[~2005-10-18  2:28 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-10-16 19:14 git-checkout-index, flag ordering and --prefix kludgy handling Blaisorblade
2005-10-17 22:58 ` Junio C Hamano
2005-10-17 22:58 ` Linus Torvalds
2005-10-18  0:33   ` Junio C Hamano
2005-10-18  1:28     ` Linus Torvalds
2005-10-18  2:27       ` Junio C Hamano [this message]
2005-10-18  2:48         ` Linus Torvalds
2005-10-18  5:49           ` Teach "git diff" to handle filenames startign with '-' Linus Torvalds
2005-10-18  5:57             ` Handle "-" at beginning of filenames, part 3 Linus Torvalds
2005-10-18  8:34         ` [PATCH] git-checkout: revert specific paths to either index or a given tree-ish Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7vmzl7tv89.fsf@assigned-by-dhcp.cox.net \
    --to=junkio@cox.net \
    --cc=git@vger.kernel.org \
    --cc=torvalds@osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).