git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Linus Torvalds <torvalds@osdl.org>
To: Junio C Hamano <junkio@cox.net>, Git Mailing List <git@vger.kernel.org>
Subject: Simplify "git reset --hard"
Date: Sun, 14 May 2006 11:20:37 -0700 (PDT)	[thread overview]
Message-ID: <Pine.LNX.4.64.0605141110150.3866@g5.osdl.org> (raw)
In-Reply-To: <Pine.LNX.4.64.0605141040210.3866@g5.osdl.org>


Now that the one-way merge strategy does the right thing wrt files that do 
not exist in the result, just remove all the random crud we did in "git 
reset" to do this all by hand.

Instead, just pass in "-u" to git-read-tree when we do a hard reset, and 
depend on git-read-tree to update the working tree appropriately.

This basically means that git reset turns into

	# Always update the HEAD ref
	git update-ref HEAD "$rev"

	case "--soft"
		# do nothing to index/working tree
	case "--hard"
		# read index _and_ update working tree
		git-read-tree --reset -u "$rev"
	case "--mixed"
		# update just index, report on working tree differences
		git-read-tree --reset "$rev"
		git-update-index --refresh

which is what it was always semantically doing, it just did it in a
rather strange way because it was written to not expect git-read-tree to 
do anything to the working tree.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
---

NOTE! The switch to use "git-read-tree -u" does actually result in a real 
change: we will now remove files that were in the index but not in HEAD 
before (ie files added with "git add"). I'd argue that this is a bug-fix.

 git-reset.sh |   50 ++++----------------------------------------------
 1 files changed, 4 insertions(+), 46 deletions(-)

diff --git a/git-reset.sh b/git-reset.sh
index 6cb073c..0ee3e3e 100755
--- a/git-reset.sh
+++ b/git-reset.sh
@@ -6,6 +6,7 @@ USAGE='[--mixed | --soft | --hard]  [<co
 tmp=${GIT_DIR}/reset.$$
 trap 'rm -f $tmp-*' 0 1 2 3 15
 
+update=
 reset_type=--mixed
 case "$1" in
 --mixed | --soft | --hard)
@@ -23,24 +24,7 @@ # We need to remember the set of paths t
 # behind before a hard reset, so that we can remove them.
 if test "$reset_type" = "--hard"
 then
-	{
-		git-ls-files --stage -z
-		git-rev-parse --verify HEAD 2>/dev/null &&
-		git-ls-tree -r -z HEAD
-	} | perl -e '
-	    use strict;
-	    my %seen;
-	    $/ = "\0";
-	    while (<>) {
-		chomp;
-		my ($info, $path) = split(/\t/, $_);
-		next if ($info =~ / tree /);
-		if (!$seen{$path}) {
-			$seen{$path} = 1;
-			print "$path\0";
-		}
-	    }
-	' >$tmp-exists
+	update=-u
 fi
 
 # Soft reset does not touch the index file nor the working tree
@@ -54,7 +38,7 @@ then
 		die "Cannot do a soft reset in the middle of a merge."
 	fi
 else
-	git-read-tree --reset "$rev" || exit
+	git-read-tree --reset $update "$rev" || exit
 fi
 
 # Any resets update HEAD to the head being switched to.
@@ -68,33 +52,7 @@ git-update-ref HEAD "$rev"
 
 case "$reset_type" in
 --hard )
-	# Hard reset matches the working tree to that of the tree
-	# being switched to.
-	git-checkout-index -f -u -q -a
-	git-ls-files --cached -z |
-	perl -e '
-		use strict;
-		my (%keep, $fh);
-		$/ = "\0";
-		while (<STDIN>) {
-			chomp;
-			$keep{$_} = 1;
-		}
-		open $fh, "<", $ARGV[0]
-			or die "cannot open $ARGV[0]";
-		while (<$fh>) {
-			chomp;
-			if (! exists $keep{$_}) {
-				# it is ok if this fails -- it may already
-				# have been culled by checkout-index.
-				unlink $_;
-				while (s|/[^/]*$||) {
-					rmdir($_) or last;
-				}
-			}
-		}
-	' $tmp-exists
-	;;
+	;; # Nothing else to do
 --soft )
 	;; # Nothing else to do
 --mixed )

  parent reply	other threads:[~2006-05-14 18:20 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-14 17:43 Allow one-way tree merge to remove old files Linus Torvalds
2006-05-14 17:51 ` Junio C Hamano
2006-05-14 18:20 ` Linus Torvalds [this message]
2006-05-15  6:55   ` Simplify "git reset --hard" Junio C Hamano
2006-05-15  7:08     ` Junio C Hamano
2006-05-15  7:46       ` Junio C Hamano
2006-05-15 14:55         ` Linus Torvalds
2006-05-15 15:09           ` Linus Torvalds

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=Pine.LNX.4.64.0605141110150.3866@g5.osdl.org \
    --to=torvalds@osdl.org \
    --cc=git@vger.kernel.org \
    --cc=junkio@cox.net \
    /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).