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>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Linus Torvalds 2006-05-14 11:20:37 -07:00 коммит произвёл Junio C Hamano
Родитель 76b99b8161
Коммит c68998f5b5
1 изменённых файлов: 4 добавлений и 46 удалений

Просмотреть файл

@ -6,6 +6,7 @@ USAGE='[--mixed | --soft | --hard] [<commit-ish>]'
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 @@ rev=$(git-rev-parse --verify $rev^0) || exit
# 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 )