threads / discuss / 46962

Can I remove multiple stashed states at a time?

Subject: Can I remove multiple stashed states at a time?

## tl;dr

4 messages between Oct 13, 2017 and Oct 14, 2017.

replies: 3people: 3as markdown or json

小川恭史· Oct 13, 2017, 02:58 UTC · lore
I want to remove multiple stashed states at a time.

But "git stash drop <stash>" removes only one stashed state at a time and "git stash clear" remove all.

Can I do that?
Jeff King· Oct 13, 2017, 17:35 UTC · re: 小川恭史 · lore

Re: Can I remove multiple stashed states at a time?

On Fri, Oct 13, 2017 at 11:58:12AM +0900, 小川恭史 wrote:
Show 6 quoted lines
> I want to remove multiple stashed states at a time.
> 
> But "git stash drop <stash>" removes only one stashed state at a time
> and "git stash clear" remove all.
> 
> Can I do that?

There isn't a way to do it through "git stash", I don't think. The stash feature is backed by a reflog, and the underlying machinery is capable of it. E.g.:

  git reflog delete --updateref --rewrite refs/stash@{1} refs/stash@{2} refs/stash@{3}

works. But that's getting a bit more familiar with the innards of stash than users should be (both because they shouldn't need to, and because the underlying storage may be subject to change).

Probably "git stash drop" should learn to take multiple stash arguments and pass them all along to "reflog delete".

You can also just do:
  for i in 1 2 3; do
     git stash drop $i
  done

of course. It's less efficient than a single invocation (since it has to rewrite the whole reflog each time), but unless you have thousands of stashes, I doubt the difference is all that noticeable.

-Peff
Kevin Daudt· Oct 14, 2017, 15:01 UTC · re: Jeff King · lore

Re: Can I remove multiple stashed states at a time?

On Fri, Oct 13, 2017 at 01:35:22PM -0400, Jeff King wrote:
Show 8 quoted lines
> On Fri, Oct 13, 2017 at 11:58:12AM +0900, 小川恭史 wrote:
> 
> You can also just do:
> 
>   for i in 1 2 3; do
>      git stash drop $i
>   done
> 

Doesn't stash 2 become stash 1 after the first drop, and the same for 3, resulting in dropping stash 1, 3 and 5?

So something like
  for i in 3 2 1; do
      git stash drop $i;
  done
Or leave $i out altogether.
Jeff King· Oct 14, 2017, 18:05 UTC · re: Kevin Daudt · lore

Re: Can I remove multiple stashed states at a time?

On Sat, Oct 14, 2017 at 05:01:23PM +0200, Kevin Daudt wrote:
Show 20 quoted lines
> On Fri, Oct 13, 2017 at 01:35:22PM -0400, Jeff King wrote:
> > On Fri, Oct 13, 2017 at 11:58:12AM +0900, 小川恭史 wrote:
> > 
> > You can also just do:
> > 
> >   for i in 1 2 3; do
> >      git stash drop $i
> >   done
> > 
> 
> Doesn't stash 2 become stash 1 after the first drop, and the same for 3,
> resulting in dropping stash 1, 3 and 5?
> 
> So something like
> 
>   for i in 3 2 1; do
>       git stash drop $i;
>   done
> 
> Or leave $i out altogether.
Oops, you're right.

For that matter, I didn't double check that a single "reflog delete" handles this case correctly. That should be easy to test, though:

  git init
  echo base >file
  git add file
  git commit -m base
  for i in $(seq 10); do
    echo $i >file
    git stash push -m $i
  done
  git reflog delete --updateref --rewrite refs/stash@{1} refs/stash@{2} refs/stash@{3}
That seems to leave:
  $ git stash list
  stash@{0}: On master: 10
  stash@{1}: On master: 8
  stash@{2}: On master: 6
  stash@{3}: On master: 4
  stash@{4}: On master: 3
  stash@{5}: On master: 2
  stash@{6}: On master: 1

which is not what we wanted (I'd guess also that it rewrites the reflog 3 times, negating any efficiency I claimed earlier).

-Peff

← back to recent threads