git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 3/3] stash: keep untracked files intact in stash -k

From
Thomas Gummerer <t.gummerer@gmail.com>
Date
Mar 22, 2017, 21:46 UTC
Message-ID
<20170322214634.GG27158@hank>
In-Reply-To
<20170321223809.c7wik5lfjylno6wn@sigill.intra.peff.net>
On 03/21, Jeff King wrote:
Show 12 quoted lines
> On Tue, Mar 21, 2017 at 10:12:19PM +0000, Thomas Gummerer wrote:
> 
> > Currently when there are untracked changes in a file "one" and in a file
> > "two" in the repository and the user uses:
> > 
> >     git stash push -k one
> > 
> > all changes in "two" are wiped out completely.  That is clearly not the
> > intended result.  Make sure that only the files given in the pathspec
> > are changed when git stash push -k <pathspec> is used.
> 
> Good description.
I basically just tweaked your report here :)  thanks for that!
Show 17 quoted lines
> > diff --git a/git-stash.sh b/git-stash.sh
> > index 13711764a9..2fb651b2b8 100755
> > --- a/git-stash.sh
> > +++ b/git-stash.sh
> > @@ -314,7 +314,9 @@ push_stash () {
> >  
> >  		if test "$keep_index" = "t" && test -n "$i_tree"
> >  		then
> > -			git read-tree --reset -u $i_tree
> > +			git read-tree --reset $i_tree
> > +			git ls-files -z --modified -- "$@" |
> > +			git checkout-index -z --force --stdin
> >  		fi
> 
> I briefly wondered if this needed "-q" to match the earlier commit, but
> "checkout-index" isn't really chatty, so I don't think so (and the
> earlier checkout-index doesn't have it either).
Yep, I had the same thoughts here.
Show 6 quoted lines
> I also wondered if this could be done in a single command as:
> 
>   git reset -q --hard $i_tree -- "$@"
> 
> But "git reset" can't handle pathspecs with "--hard" (which is why the
> similar case a few lines above uses the same commands).

Yeah unfortunately, that would have made the previous patch series quite a bit easier :) But here it wouldn't help anyway, as git reset without pathspecs can't handle a tree-ish either, right? And we also want to handle the case where no pathspecs are given to git stash.

Show 20 quoted lines
> 
> So this looks good to me.
> 
> > +test_expect_success 'stash -k -- <pathspec> leaves unstaged files intact' '
> > +	git reset &&
> > +	>foo &&
> > +	>bar &&
> > +	git add foo bar &&
> > +	git commit -m "test" &&
> > +	echo "foo" >foo &&
> > +	echo "bar" >bar &&
> > +	git stash -k -- foo &&
> > +	test "",bar = $(cat foo),$(cat bar) &&
> > +	git stash pop &&
> > +	test foo,bar = $(cat foo),$(cat bar)
> > +'
> 
> I always get nervous when I see test arguments without quotes, but I
> think this is fine (and I couldn't see a shorter way of doing it with
> test_cmp).

Hmm yeah I basically copied this from a different test and tweaked it a bit to fit here.

> -Peff
Previous: Jeff KingNext: Jeff King
Message 25 of 26 in “[BUG] "git stash -- path" reports wrong unstaged changes”
  1. Jeff KingMar 17, 2017
  2. Thomas GummererMar 18, 2017
  3. Thomas GummererMar 19, 2017
  4. 1/3 stash: show less information for stash push -- <pathspec>Thomas Gummerer, Mar 19, 2017
  5. Junio C HamanoMar 20, 2017
  6. Jeff KingMar 20, 2017
  7. Junio C HamanoMar 20, 2017
  8. Thomas GummererMar 21, 2017
  9. Jeff KingMar 20, 2017
  10. 3/3 stash: pass the pathspec argument to git resetThomas Gummerer, Mar 19, 2017
  11. Jeff KingMar 20, 2017
  12. Thomas GummererMar 21, 2017
  13. Jeff KingMar 21, 2017
  14. 2/3 stash: make push -p -q --no-keep-index quietThomas Gummerer, Mar 19, 2017
  15. Jeff KingMar 20, 2017
  16. 0/3 Re: [BUG] "git stash -- path" reports wrong unstaged changesThomas Gummerer, Mar 21, 2017
  17. 2/3 stash: pass the pathspec argument to git resetThomas Gummerer, Mar 21, 2017
  18. Jeff KingMar 21, 2017
  19. 1/3 stash: don't show internal implementation detailsThomas Gummerer, Mar 21, 2017
  20. Jeff KingMar 21, 2017
  21. Thomas GummererMar 22, 2017
  22. Jeff KingMar 22, 2017
  23. 3/3 stash: keep untracked files intact in stash -kThomas Gummerer, Mar 21, 2017
  24. Jeff KingMar 21, 2017
  25. Thomas GummererMar 22, 2017
  26. Jeff KingMar 20, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.