Re: A cross between 'git stash create' and 'git stash push --include-untracked'?
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Mar 31, 2025, 07:47 UTC
- Message-ID
- <Z-pIrCp6ZewWuPI0@pks.im>
- In-Reply-To
- <d8f596cfac9b001350b8b5e408067bb4caa073a7.camel@gmail.com>
On Sun, Mar 30, 2025 at 05:37:42PM +0300, Alexander Shpilkin wrote:
Show 21 quoted lines
> 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