From: Karthik Nayak Date: Mon, 02 Feb 2026 14:10:35 GMT Subject: Re: [PATCH] stash: honor --no-overwrite-ignore when updating index Message-ID: In-Reply-To: <20260202131921.15175-2-pushkarkumarsingh1970@gmail.com> Pushkar Singh writes: > The stash code unconditionally cleared opts.preserve_ignored when > updating the index, leaving a FIXME suggesting this should depend on > an overwrite_ignore flag. > > Introduce overwrite_ignore plumbing for git stash push/save and use it > to control preserve_ignored during reset_tree(). Add a test to verify > that --no-overwrite-ignore preserves ignored files. > > This removes the long-standing FIXME and aligns stash behavior with > checkout/reset/merge. > --- > builtin/stash.c | 11 ++++++++++- > t/t3905-stash-include-untracked.sh | 13 +++++++++++++ > 2 files changed, 23 insertions(+), 1 deletion(-) > > diff --git a/builtin/stash.c b/builtin/stash.c > index 193e3ea47a..82d10520fe 100644 > --- a/builtin/stash.c > +++ b/builtin/stash.c > @@ -150,6 +150,7 @@ static int show_stat = 1; > static int show_patch; > static int show_include_untracked; > static int use_index; > +static int overwrite_ignore = 1; > > /* > * w_commit is set to the commit containing the working tree > @@ -360,7 +361,7 @@ static int reset_tree(struct object_id *i_tree, int update, int reset) > opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0; > opts.update = update; > if (update) > - opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */ > + opts.preserve_ignored = !overwrite_ignore; > opts.fn = oneway_merge; > > if (unpack_trees(nr_trees, t, &opts)) > @@ -1856,6 +1857,10 @@ static int push_stash(int argc, const char **argv, const char *prefix, > N_("include untracked files in stash")), > OPT_SET_INT('a', "all", &include_untracked, > N_("include ignore files"), 2), > + OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, > + N_("update ignored files (default)")), > + OPT_BOOL(0, "no-overwrite-ignore", &overwrite_ignore, > + N_("do not update ignored files")), Adding an `OPT_BOOL` by default adds a [no] option. from Documentation/technical/api-parse-options.adoc: `OPT_BOOL(short, long, &int_var, description)`:: Introduce a boolean option. `int_var` is set to one with `--option` and set to zero with `--no-option`. Apart from that, isn't this plain wrong?? The '--overwrite-ignore' and '--no-overwrite-ignore' do the same thing here? > OPT_STRING('m', "message", &stash_msg, N_("message"), > N_("stash message")), > OPT_PATHSPEC_FROM_FILE(&pathspec_from_file), > @@ -1959,6 +1964,10 @@ static int save_stash(int argc, const char **argv, const char *prefix, > N_("include untracked files in stash")), > OPT_SET_INT('a', "all", &include_untracked, > N_("include ignore files"), 2), > + OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, > + N_("update ignored files (default)")), > + OPT_BOOL(0, "no-overwrite-ignore", &overwrite_ignore, > + N_("do not update ignored files")), Here too. > OPT_STRING('m', "message", &stash_msg, "message", > N_("stash message")), > OPT_END() > diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh > index 7704709054..9c5421cd76 100755 > --- a/t/t3905-stash-include-untracked.sh > +++ b/t/t3905-stash-include-untracked.sh > @@ -427,4 +427,17 @@ test_expect_success 'stash -u ignores sub-repository' ' > git stash -u > ' > > +test_expect_success 'stash push --no-overwrite-ignore preserves ignored files' ' > + echo ignored.txt >>.gitignore && > + echo before >ignored.txt && > + git add .gitignore && > + git commit -m "add ignore" && > + > + echo after >ignored.txt && > + git stash push --no-overwrite-ignore && > + > + test_path_is_file ignored.txt && > + grep after ignored.txt > +' > + To confirm, changing the test modified t/t3905-stash-include-untracked.sh @@ -434,7 +434,7 @@ test_expect_success 'stash push --no-overwrite-ignore preserves ignored files' ' git commit -m "add ignore" && echo after >ignored.txt && - git stash push --no-overwrite-ignore && + git stash push --overwrite-ignore && test_path_is_file ignored.txt && grep after ignored.txt still passes the test. We should be testing both scenarios. > test_done > -- > 2.43.0