Are "dangling" and "loose" objects the same?

0

Issue

Git’s fsck doc talks about "dangling" objects, while the gc doc talks only about "loose objects". There’s a strict split.

But while skimming a few related SO posts, the terms seem to be used interchangeably. In the Git Book v2 and Git’s source code as well:

   (main) $ git checkout v2.33.0
(225bc32) $ rg 'dangling (object|commit|blob|tag|tree)' | wc -l
      31
(225bc32) $ rg 'loose (object|commit|blob|tag|tree)' | wc -l
     117

Lastly, both commands are often used in sequence, and it seems clear to me from their behavior that they target the same things.

Thus, "dangling" and "loose" are just 2 similar terms for the same concept. Is this summary correct?


Or is "loose objects" rather a category, while "dangling" is reserved intentionally for the specific types of objects?

Solution

  • Loose objects – are those that aren’t packed. Git can compress many loose objects into a single pack file.
  • Dangling object – is the one that’s not referenced by anything (e.g. an orphan commit which has no branch/tag pointing to it). It’s garbage that will at some point be collected by GC.
  • "Unreachable" object (see comment by @torek). If commit A is a parent of B, then A is not dangling even if B is. Instead A is "unreachable". It’s also part of garbage.

Loose object can be dangling, packs can contain dangling objects. So these concepts are orthogonal. But you can create a reference (branch, tag) which will reference a dangling commit and it will stop "dangle".

Answered By – Stanislav Bashkyrtsev

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave A Reply

Your email address will not be published.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More