[go: up one dir, main page]

Skip to content

Git leaks empty reference directories if reference transaction isn't committed

Preparing a reference transaction with git update-ref and not committing it leads to leaking empty reference directories with git version 2.49.0.

When stdin is closed after preparing, a reference directory is leaked:

~/refs-test-del master
❯ ls .git/refs/heads/

~/refs-test-del master
❯ echo -ne 'start\ndelete refs/heads/subdir/reference\nprepare\n' | git update-ref --stdin
start: ok
prepare: ok

~/refs-test-del master
❯ ls .git/refs/heads/
subdir/

When a reference transaction is aborted, a reference directory is leaked:

~/refs-test-del master
❯ ls .git/refs/heads/

~/refs-test-del master
❯ echo -ne 'start\ndelete refs/heads/subdir/reference\nprepare\nabort\n' | git update-ref --stdin
start: ok
prepare: ok
abort: ok

~/refs-test-del master
❯ ls .git/refs/heads/
subdir/

When a reference transaction is committed, the directory is cleaned up:

~/refs-test-del master
❯ ls .git/refs/heads/

~/refs-test-del master
❯ echo -ne 'start\ndelete refs/heads/subdir/reference\nprepare\ncommit\n' | git update-ref --stdin
start: ok
prepare: ok
commit: ok

~/refs-test-del master
❯ ls .git/refs/heads/
Edited by Sami Hiltunen