“悬挂”和“松动”的物体是相同的吗?

7

Git的fsck文档谈到了“悬空”对象,而gc文档仅谈论“松散”对象。存在严格的区分。

但是在阅读一些相关的SO帖子时,这些术语似乎可以互换使用。在Git Book v2和Git的源代码中也是如此:

   (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

最后,这两个命令通常按顺序使用,从它们的行为来看,它们似乎针对相同的内容。
因此,“dangling”和“loose”只是同一概念的2个类似术语。这个总结正确吗?
"松散的对象"是否是一个类别,而"dangling"则有意保留给特定类型的对象?"
1个回答

8
  • 松散对象 - 指未打包的对象。Git可以将许多松散对象压缩成一个文件包。
  • 悬空对象 - 是指没有被其他对象引用的对象(例如孤儿提交,没有分支/标签指向它)。这是垃圾,最终会被垃圾回收器收集。
  • “不可达”对象(参见@torek的评论)。如果提交A是B的父提交,则即使B是悬空的,A也不是悬空的。而是“不可达”的。它也是垃圾的一部分。

松散对象可能是悬空的,文件包可以包含悬空对象。所以这些概念是正交的。但是您可以创建引用(分支、标签),它将引用悬空提交,并阻止其“悬空”。


2
谢谢!这就是我所缺少的:“loose vs. _packed_”,但是“dangling vs. _referenced_”。 - Katrin Leinweber
3
@KatrinLeinweber说得很好。虽然“reachable”可能是“referenced”的更准确版本。 - Stanislav Bashkyrtsev
2
对于可链接的对象(提交和树),Git 在“未引用”/“不可到达”和“悬空”之间进行区分。例如,假设您在 B 分支末尾的现有提交 H 之上进行了提交 I-J-K。然后您运行 git reset B~3 来删除所有三个新的提交:B 现在指向 H,而不是 K。虽然所有三个提交都成为了未引用/不可到达的状态,但只有一个是“悬空”的,因为如果将“悬空”的端点变得可到达,则有两个提交可以到达它。(这只是真正缩短 git fsck 输出的方式而已。) - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接