stash create: remove duplicate changes detection

Before it creates a stash, git checks if there are any unstaged,
or uncommitted changes. If there isn't anything to stash it bails
out. Since ef0f0b4509 (stash: optimize `get_untracked_files()`
and `check_changes()`, 2019-02-25) "git stash store" has checked
for changes twice, once in create_stash() before we refresh the
index and then again in do_create_stash() after the index has been
refreshed. That commit claims it is an optimization but it is not
clear what it is trying to optimize by checking for changes twice,
especially as checking for changes before refreshing the index is
unreliable (the scripted version of "git stash store", called "git
update-index -q --refresh" before looking for any changes).

Avoid checking for changes twice by removing the call to
check_changes_tracked_files() from store_stash() and restore the return
code handling in store_stash() that was removed by ef0f0b4509 so that
we continue to exit 0 when there are no changes to stash. In principle
we could remove the call to check_changes() from do_store_stash()
instead, but then we'd need to pass in the list of untracked files.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
jch^2
Phillip Wood 2026-10-05 17:35:30 +01:00 committed by Junio C Hamano
parent a018953688
commit 03ed2a45ae
1 changed files with 5 additions and 3 deletions

View File

@ -1655,8 +1655,6 @@ static int create_stash(int argc, const char **argv, const char *prefix UNUSED,
strbuf_join_argv(&stash_msg_buf, argc - 1, ++argv, ' ');

memset(&ps, 0, sizeof(ps));
if (!check_changes_tracked_files(&ps))
return 0;

ret = do_create_stash(&ps, &stash_msg_buf, 0, 0, NULL, 0, &info,
NULL, 0);
@ -1665,7 +1663,11 @@ static int create_stash(int argc, const char **argv, const char *prefix UNUSED,

free_stash_info(&info);
strbuf_release(&stash_msg_buf);
return ret;
/*
* ret is 1 if there were no changes. In this case, we should
* not error out.
*/
return ret < 0;
}

static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int quiet,