# How do I get rid of unneeded objects?

3 messages from 2019-01-18 to 2019-01-19. Participants: Steve Keller, Eric Wong, Kevin Daudt.
Thread: https://gitlist.dev/t/50261

## Steve Keller, 2019-01-18 13:39

Subject: How do I get rid of unneeded objects?
Message-ID: <trinity-02f2f7de-850d-4ad6-b709-86b7914cd81f-1547818792471@3c-app-gmx-bs22>
URL: https://gitlist.dev/e/trinity-02f2f7de-850d-4ad6-b709-86b7914cd81f-1547818792471%403c-app-gmx-bs22

```
After deleting a branch or amending a commit I still have orphaned
objects in the repository:

    $ mkdir repo; cd repo
    $ git init
    $ date > foo; git add foo; git commit -mmsg1                                        
    $ date > foo; git add foo; git commit -mmsg2                                        
    $ git checkout -b branch-1 HEAD^
    Switched to a new branch 'branch-1'
    $ git commit --allow-empty -mbranch-1
    [branch-1 84cfad2] branch-1
    $ git log --oneline
    84cfad2 branch-1
    09fdcb1 msg1
    $ find .git/objects/ -type f | sort | nl
    1  .git/objects/09/fdcb1cb7d5642874bd642ce5685ac0bebd116c
    2  .git/objects/41/d9ceb271c5e72f8a94a38dc4852ab501566bd1
    3  .git/objects/4f/c6596065dd08ebc62ce0728e2407d58dbde7e1
    4  .git/objects/5f/c4d7af12460d774be720f8761da0be2595404d
    5  .git/objects/84/cfad2cea2ae3f7a67530d5c596853f656e68d9
    6  .git/objects/a1/5faea60776cd537c4ef527f08caff48ff6c86b
    7  .git/objects/c8/c0278da7cf96d86c5881f3884b5015deee7113

These objects are 2 files, 2 trees, and 3 commits.  If now delete the
branch again, I'd like to have the unneeded commit deleted, but:

    $ git checkout master
    Switched to branch 'master'
    $ git branch -D branch-1
    Deleted branch branch-1 (was 84cfad2).
    $ git reflog expire --all
    $ git prune
    $ find .git/objects/ -type f | sort | nl
    1  .git/objects/09/fdcb1cb7d5642874bd642ce5685ac0bebd116c
    2  .git/objects/41/d9ceb271c5e72f8a94a38dc4852ab501566bd1
    3  .git/objects/4f/c6596065dd08ebc62ce0728e2407d58dbde7e1
    4  .git/objects/5f/c4d7af12460d774be720f8761da0be2595404d
    5  .git/objects/84/cfad2cea2ae3f7a67530d5c596853f656e68d9   <-- [1]
    6  .git/objects/a1/5faea60776cd537c4ef527f08caff48ff6c86b
    7  .git/objects/c8/c0278da7cf96d86c5881f3884b5015deee7113

Why is [1] not deleted?  It seems reflog still knows about the deleted
branch, and probably this is the reason git keeps the referenced
commit:

    $ git reflog
    c8c0278 HEAD@{0}: checkout: moving from branch-1 to master
    84cfad2 HEAD@{1}: commit: branch-1
    09fdcb1 HEAD@{2}: checkout: moving from master to branch-1
    c8c0278 HEAD@{3}: commit: msg2
    09fdcb1 HEAD@{4}: commit (initial): msg1

Also, git gc, mentioned in the man page for git-reflog does not help.
And I see similar things when amending a commit, where the old commit
object is kept.  How can one get rid of this?

Steve

```

## Eric Wong, 2019-01-18 22:40

Subject: Re: How do I get rid of unneeded objects?
Message-ID: <20190118224055.zpsz63b3gaxtwscu@dcvr>
URL: https://gitlist.dev/e/20190118224055.zpsz63b3gaxtwscu%40dcvr
In-Reply-To: <trinity-02f2f7de-850d-4ad6-b709-86b7914cd81f-1547818792471@3c-app-gmx-bs22>

```
Steve Keller <keller.steve@gmx.de> wrote:
>     $ git reflog expire --all

I've never used "git reflog" directly, but I think you need to
add "--expire=all" to cover all time.  "--all" is only for all
branches, so you need "--expire=<time>" is for a time range.

Fwiw, I use a single command:

	git -c gc.reflogExpire=now gc --prune=all

```

## Kevin Daudt, 2019-01-19 07:38

Subject: Re: How do I get rid of unneeded objects?
Message-ID: <20190119073808.GA14639@alpha>
URL: https://gitlist.dev/e/20190119073808.GA14639%40alpha
In-Reply-To: <20190118224055.zpsz63b3gaxtwscu@dcvr>

```
On Fri, Jan 18, 2019 at 10:40:55PM +0000, Eric Wong wrote:
> Steve Keller <keller.steve@gmx.de> wrote:
> >     $ git reflog expire --all
> 
> I've never used "git reflog" directly, but I think you need to
> add "--expire=all" to cover all time.  "--all" is only for all
> branches, so you need "--expire=<time>" is for a time range.
> 
> Fwiw, I use a single command:
> 
> 	git -c gc.reflogExpire=now gc --prune=all

Instead of --expire, you could also use --expire-unreachable, so that
you don't get rid of your entire reflog.

```
