I've got a Git repository with plenty of commits that are under no particular branch, I can git show
them, but when I try to list branches that contain them, it reports back nothing.
I thought this is the dangling commits/tree issue (as a result of -D branch), so I pruned the repo, but I still see the same behavior after that:
$ git fetch origin
$ git fsck --unreachable
$ git fsck
No output, nothing dangling (right?). But the commit exists
$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ...
and it is not reachable through any branch as
$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042
gives no output.
What exactly is the state of that commit? How can I list all commits in a similar state? How can I delete commits like those?
No output, nothing dangling (right?)
Note that commits referred to from your reflog are considered reachable.
What exactly is the state of that commit? How can I list all commits with similar state
Pass --no-reflogs
to convince git fsck
to show them to you.
How can I delete commits like those?
Once your reflog entries are expired, those objects will then also be cleaned up by git gc
.
Expiry is regulated by the gc.pruneexpire
, gc.reflogexpire
, and gc.reflogexpireunreachable
settings. Cf. git help config
.
The defaults are all quite reasonable.