threads / discuss / 60869

git gc destroys autostash

Subject: git gc destroys autostash

## tl;dr

3 messages between Feb 7, 2024 and Feb 7, 2024.

replies: 2people: 3as markdown or json

Orgad Shaneh· Feb 7, 2024, 20:52 UTC · lore

Running git gc --prune=now during rebase with autostash deletes the autostash object, and it cannot be recovered when the rebase ends.

Example:
#!/bin/sh

git init echo 1 > foo; git add foo; git commit -m 'Initial commit' echo 2 > foo; git add foo; git commit -m 'Second commit' echo 3 > foo; git rebase -i --autostash HEAD^ # Choose edit git gc --prune=now git rebase --continue # fatal: '3b88163a1bff3859a005554c168d94e5357ee45b' is not a stash-like commit # error: cannot store 3b88163a1bff3859a005554c168d94e5357ee45b # Successfully rebased and updated refs/heads/master.

Thanks,
- Orgad
Junio C Hamano· Feb 7, 2024, 21:05 UTC · re: Orgad Shaneh · lore

Re: git gc destroys autostash

Orgad Shaneh <orgads@gmail.com> writes:
Show 13 quoted lines
> Running git gc --prune=now during rebase with autostash deletes the
> autostash object, and it cannot be recovered when the rebase ends.
>
> Example:
>
> #!/bin/sh
>
> git init
> echo 1 > foo; git add foo; git commit -m 'Initial commit'
> echo 2 > foo; git add foo; git commit -m 'Second commit'
> echo 3 > foo; git rebase -i --autostash HEAD^
> # Choose edit
> git gc --prune=now

This is totally expected, unfortunately, as the autostash does not use the ref API to use the refs/stash (presumably in order to avoid shifting the shash@{$N} numbers). Because of that, the stash entry is not protected from the garbage collection. This currently falls into "it hurts when I twist my arm this way. --do not do it then" category.

It may be a simple fix to teach sequencer.c:apply_save_autostash() not to use a random on-disk file to store the returned value from "git stash create", but use a dedicated ref that is not refs/stash for its own use via proper use of the ref API.

Show 7 quoted lines
> git rebase --continue
> # fatal: '3b88163a1bff3859a005554c168d94e5357ee45b' is not a stash-like commit
> # error: cannot store 3b88163a1bff3859a005554c168d94e5357ee45b
> # Successfully rebased and updated refs/heads/master.
>
> Thanks,
> - Orgad
Kristoffer Haugsbakk· Feb 7, 2024, 21:47 UTC · re: Orgad Shaneh · lore

Re: git gc destroys autostash

On Wed, Feb 7, 2024, at 21:52, Orgad Shaneh wrote:
> Running git gc --prune=now during rebase with autostash deletes the
> autostash object, and it cannot be recovered when the rebase ends.

Things like this is why I don’t use the stash.[1][2] I just commit everything of value and non-value.

† 1: With very rare exceptions where the stash is popped before the
    whole operation leaves my own working memory
† 2: Also how you have to find unreachable objects using git-fsck(1) if
    you pop the last stash
-- 
Kristoffer Haugsbakk

← back to recent threads