【问题标题】:Are "dangling" and "loose" objects the same?“悬空”和“松散”的物体是一样的吗?
【发布时间】:2021-11-05 20:37:20
【问题描述】:

Git 的 fsck doc 谈论“悬空”对象,而 the gc doc 仅谈论“松散对象”。有严格的划分。

但在浏览一些相关的 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

最后,这两个命令经常按顺序使用,从它们的行为中我可以清楚地看出它们的目标是相同的。

因此,“悬空”和“松散”只是同一概念的两个相似术语。这个总结正确吗?


或者“松散的对象”是一个类别,而“悬空”是故意为特定类型的对象保留的?

【问题讨论】:

    标签: git git-gc git-plumbing git-fsck


    【解决方案1】:
    • 散装物品 - 未打包的物品。 Git 可以将许多松散的对象压缩到一个包文件中。
    • 悬空对象 - 没有被任何东西引用的对象(例如,没有分支/标签指向它的孤立提交)。 GC 会在某个时候收集这些垃圾。
    • “无法访问”对象(参见@torek 的评论)。如果提交 A 是 B 的父级,那么即使 B 是,A 也不会悬空。相反,A 是“无法到达的”。这也是垃圾的一部分。

    松散的物体可以是悬空的,包可以包含悬空的物体。所以这些概念是正交的。但是你可以创建一个引用(分支,标签),它将引用一个悬空提交,它将停止“悬空”。

    【讨论】:

    • 谢谢!这就是我所缺少的:“松散 vs. packed”,但“悬空 vs. referenced
    • @KatrinLeinweber,说得好。虽然“可达”可能是“引用”的更准确版本。
    • 对于可链接的对象(提交和树),Git 区分“未引用”/“不可访问”和“悬空”。例如,假设您在分支 B 末尾的现有提交 H 之上提交了 IJK。然后您运行 git reset B~3 以删除所有三个新提交:B 现在指向 H,而不是 K。所有三个现在都未引用/无法访问,但是只有一个是“悬空”的,因为如果“悬空”端可以到达,则有两个可以到达。 (这只是缩短了 git fsck 的输出,真的。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2017-04-26
    • 2010-11-15
    相关资源
    最近更新 更多