]> git.ipfire.org Git - thirdparty/git.git/commit
stash: handle staged changes in skip-worktree files correctly
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Wed, 30 Oct 2019 10:49:38 +0000 (10:49 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 2 Nov 2019 06:22:45 +0000 (15:22 +0900)
commit4a58c3d7f7a83ebcd4ede635871cab7be24f7f3f
tree127863a57bb8f9c640db43557850e6589d6b711c
parent8dfb04ae964868dda758997e5e7da29edff6164b
stash: handle staged changes in skip-worktree files correctly

When calling `git stash` while changes were staged for files that are
marked with the `skip-worktree` bit (e.g. files that are excluded in a
sparse checkout), the files are recorded as _deleted_ instead.

The reason is that `git stash` tries to construct the tree reflecting
the worktree essentially by copying the index to a temporary one and
then updating the files from the worktree. Crucially, it calls `git
diff-index` to update also those files that are in the HEAD but have
been unstaged in the index.

However, when the temporary index is updated via `git update-index --add
--remove`, skip-worktree entries mark the files as deleted by mistake.

Let's use the newly-introduced `--ignore-skip-worktree-entries` option
of `git update-index` to prevent exactly this from happening.

Note that the regression test case deliberately avoids replicating the
scenario described above and instead tries to recreate just the symptom.

Reported by Dan Thompson.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/stash.c
git-legacy-stash.sh
t/t3903-stash.sh