mirror of
https://github.com/git/git.git
synced 2024-12-03 23:14:23 +08:00
Fix git-stash apply --index
Two bugs that made the command practically unusable were fixed with this. - A stash created with a clean index does not have any difference between the base tree and the index tree. Trying to apply the diff between them to the index would error out with "No changes". Even when the user asked to unstash with --index, do not bother with --index action if the base tree and the index tree match. - After successfully performing the working tree merge, the index was reloaded from an earlier state of unstashed index with "read-tree"; this left all the paths cache dirty. By moving the call to git-status after this read-tree, match the cached stat information in the index. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
f12e925ac2
commit
cbeaccc316
23
git-stash.sh
23
git-stash.sh
@ -128,19 +128,24 @@ apply_stash () {
|
|||||||
c_tree=$(git write-tree) ||
|
c_tree=$(git write-tree) ||
|
||||||
die 'Cannot apply a stash in the middle of a merge'
|
die 'Cannot apply a stash in the middle of a merge'
|
||||||
|
|
||||||
|
# stash records the work tree, and is a merge between the
|
||||||
|
# base commit (first parent) and the index tree (second parent).
|
||||||
s=$(git rev-parse --revs-only --no-flags --default $ref_stash "$@") &&
|
s=$(git rev-parse --revs-only --no-flags --default $ref_stash "$@") &&
|
||||||
w_tree=$(git rev-parse --verify "$s:") &&
|
w_tree=$(git rev-parse --verify "$s:") &&
|
||||||
b_tree=$(git rev-parse --verify "$s^:") ||
|
b_tree=$(git rev-parse --verify "$s^1:") &&
|
||||||
|
i_tree=$(git rev-parse --verify "$s^2:") ||
|
||||||
die "$*: no valid stashed state found"
|
die "$*: no valid stashed state found"
|
||||||
|
|
||||||
test -z "$unstash_index" || {
|
unstashed_index_tree=
|
||||||
|
if test -n "$unstash_index" && test "$b_tree" != "$i_tree"
|
||||||
|
then
|
||||||
git diff --binary $s^2^..$s^2 | git apply --cached
|
git diff --binary $s^2^..$s^2 | git apply --cached
|
||||||
test $? -ne 0 &&
|
test $? -ne 0 &&
|
||||||
die 'Conflicts in index. Try without --index.'
|
die 'Conflicts in index. Try without --index.'
|
||||||
unstashed_index_tree=$(git-write-tree) ||
|
unstashed_index_tree=$(git-write-tree) ||
|
||||||
die 'Could not save index tree'
|
die 'Could not save index tree'
|
||||||
git reset
|
git reset
|
||||||
}
|
fi
|
||||||
|
|
||||||
eval "
|
eval "
|
||||||
GITHEAD_$w_tree='Stashed changes' &&
|
GITHEAD_$w_tree='Stashed changes' &&
|
||||||
@ -157,13 +162,19 @@ apply_stash () {
|
|||||||
git read-tree --reset $c_tree &&
|
git read-tree --reset $c_tree &&
|
||||||
git update-index --add --stdin <"$a" ||
|
git update-index --add --stdin <"$a" ||
|
||||||
die "Cannot unstage modified files"
|
die "Cannot unstage modified files"
|
||||||
git-status
|
|
||||||
rm -f "$a"
|
rm -f "$a"
|
||||||
test -z "$unstash_index" || git read-tree $unstashed_index_tree
|
if test -n "$unstashed_index_tree"
|
||||||
|
then
|
||||||
|
git read-tree "$unstashed_index_tree"
|
||||||
|
fi
|
||||||
|
git status || :
|
||||||
else
|
else
|
||||||
# Merge conflict; keep the exit status from merge-recursive
|
# Merge conflict; keep the exit status from merge-recursive
|
||||||
status=$?
|
status=$?
|
||||||
test -z "$unstash_index" || echo 'Index was not unstashed.' >&2
|
if test -n "$unstash_index"
|
||||||
|
then
|
||||||
|
echo >&2 'Index was not unstashed.'
|
||||||
|
fi
|
||||||
exit $status
|
exit $status
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user