Subject: Re: A cross between 'git stash create' and 'git stash push --include-untracked'?

From: Patrick Steinhardt <[email-masked]>
Date: Mon, 31 Mar 2025 09:47:56 +0200

On Sun, Mar 30, 2025 at 05:37:42PM +0300, Alexander Shpilkin wrote:
> Hi,
> 
> I'm trying to write a script for my use that would run before every
> invocation of 'make' and record the working tree state at that point. 
> Stripping out the boring parts, it is basically just
> 
>     git update-ref --create-reflog refs/build $(git stash create)
> 
> but the problem is that what I want is less like 'git stash create' and
> more like 'git stash create --include-untracked', in case there are any
> new and as yet untracked source files that are nevertheless picked up
> by the build system.
> 
> Of course, that does not exist and, because of the syntax of 'git stash
> create', cannot exist.  I've looked at the code in builtin/stash.c and
> it looks like there are only two callers of do_create_stash(): one is
> create_stash() and hardcodes the include_untracked argument to zero,
> the other is do_push_stash() and (assuming I try to undo its effects
> with 'git stash pop' afterwards) will potentially destroy my working
> tree's mtimes and cause more rebuilding than necessary.  So it seems
> like I'm stuck here.

Indeed.

> Any suggestions?

I guess the obvious answer here is to extend `git stash create` so that
it knows to handle "--include-untracked".

Unfortunately, it wouldn't be quite as simple as just wiring up the
command line option and passing the flag to `do_create_stash()` because
`save_untracked_files()` saves untracked files by modifying the
repository's index. Consequentially, we would still end up modifying the
repository, even though the checked out files would ultimately remain
unmodified.

I think we'd have to teach `save_untracked_files()` to do the changes on
an in-memory index instead of invoking git-update-index(1). And if it
knew to do that we could easily wire it up for `git stash create` and
thus implement your usecase.

I won't be working on this myself as I'm short on time, but I assume
that patches would very much be welcome.

Thanks!

Patrick