Message ID | 9835e66399b5feeb3313bcee62f0519c025a4ca2.1572261615.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix git stash with skip-worktree entries | expand |
"Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com> writes: > From: Johannes Schindelin <johannes.schindelin@gmx.de> > > 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. Good. Much easier to see what is going on than the verb "lose" used in the cover letter of v1 that puzzled me. > 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. Good. > Note that the regression test case deliberately avoids replicating the > scenario described above and instead tries to recreate just the symptom. That's good. Testing the end-user visible effect is just as important as the narrowly pointed root-cause test like the one in the previous patch. Thanks.
diff --git a/builtin/stash.c b/builtin/stash.c index ab30d1e920..e3962bf73e 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -1082,8 +1082,9 @@ static int stash_working_tree(struct stash_info *info, const struct pathspec *ps } cp_upd_index.git_cmd = 1; - argv_array_pushl(&cp_upd_index.args, "update-index", "-z", "--add", - "--remove", "--stdin", NULL); + argv_array_pushl(&cp_upd_index.args, "update-index", + "--ignore-skip-worktree-entries", + "-z", "--add", "--remove", "--stdin", NULL); argv_array_pushf(&cp_upd_index.env_array, "GIT_INDEX_FILE=%s", stash_index_path.buf); diff --git a/git-legacy-stash.sh b/git-legacy-stash.sh index f60e9b3e87..5398a5161d 100755 --- a/git-legacy-stash.sh +++ b/git-legacy-stash.sh @@ -193,7 +193,8 @@ create_stash () { GIT_INDEX_FILE="$TMPindex" && export GIT_INDEX_FILE && git diff-index --name-only -z HEAD -- "$@" >"$TMP-stagenames" && - git update-index -z --add --remove --stdin <"$TMP-stagenames" && + git update-index --ignore-skip-worktree-entries \ + -z --add --remove --stdin <"$TMP-stagenames" && git write-tree && rm -f "$TMPindex" ) ) || diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index 392954d6dd..57258d5668 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -1257,4 +1257,15 @@ test_expect_success 'stash apply should succeed with unmodified file' ' git stash apply ' +test_expect_success 'stash handles skip-worktree entries nicely' ' + test_commit A && + echo changed >A.t && + git add A.t && + git update-index --skip-worktree A.t && + rm A.t && + git stash && + + git rev-parse --verify refs/stash:A.t +' + test_done