【问题标题】:What are the "loose objects" that the Git GUI refers to?Git GUI 所指的“松散对象”是什么?
【发布时间】:2011-04-18 22:38:14
【问题描述】:

当我打开 Git GUI 时,我会收到一条引用 loose objects 的弹出消息。我做了git gc 并删除了消息。

什么是loose objects,我该如何防止这种情况再次发生?

【问题讨论】:

  • 当弹出消息询问是否应该立即打包松散的对象时,您只需点击“是”即可。 Git GUI 将为您运行 git gc,并带有一个漂亮的 GUI 进度条(尽管大部分时间显示为卡住)。

标签: git


【解决方案1】:

Git Book 很好地解释了这一点: https://git-scm.com/book/en/v2/Git-Internals-Packfiles

松散的对象是更简单的格式。 它只是压缩数据 存储在磁盘上的单个文件中。每一个 对象写入单独的文件。

【讨论】:

    【解决方案2】:

    带有 SHA 的对象(blob、树和提交)说 - 810cae53e0f622d6804f063c04a83dbc3a11b7ca 将存储在

    .git/objects/81/0cae53e0f622d6804f063c04a83dbc3a11b7ca
    

    (拆分前两个字符以提高文件系统的性能,因为现在并非所有对象都存储在同一目录中)

    如上存储的对象称为松散对象。

    当您开始使用您的 repo 时,您的对象大多是松散的。随着数量的增加,它变得低效,它们被存储在一个包文件中。此类对象称为打包对象。

     git gc
    

    是你用来打包对象的东西(通常不需要和几周前的松散对象也会被删除,使用--prune=<date> 选项你可以强制删除不再需要的松散对象。就像你修改提交时一样。不再需要旧的提交对象。)

    【讨论】:

    • --prune 选项默认开启,由于git gc 是由常用用法(例如commit)自动触发的,因此您通常不必担心这一点。我不使用 git gui,也无法准确找到它在源代码中的触发位置,但它要么自己检查,要么只是拦截由调用命令触发的 gc。当然,这没什么好担心的,只是正常使用造成的。
    • 打包松散的物品有什么缺点吗?如果没有,为什么 Git 不自动做呢?
    • 我认为它不会自动发生。我经常提交,但提到的 'git gui' 有 50,000 个松散对象(并且一直想知道为什么 git 这么慢,大型项目超过 4 年,没有手动 gc)
    • @Kevin 在手动运行git gc 后,您的大型项目的性能是否有所提高?我认为它应该改进,因为松散的对象效率低下,而 50,000 是一个非常大的数字。我还发现打包也大大减少了.git文件夹使用的空间。
    • @LouisRhys,“将对象写入磁盘时,通常采用松散格式,因为该格式访问成本较低。但是,最终您会希望通过打包来节省空间对象”——来自answer below中的 Git Book 链接
    猜你喜欢
    • 2011-05-14
    • 2010-11-09
    • 2010-09-14
    • 2014-02-22
    • 2016-02-18
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多