Gitlab 物体松动的原因是什么?“git prune”可以安全地删除它们吗?

Gitlab 物体松动的原因是什么?“git prune”可以安全地删除它们吗?,gitlab,git,git-svn,Gitlab,Git,Git Svn,我使用的是本地Git回购协议,该协议使用我们公司的SVN回购协议作为来源 我经常收到这样的信息: 错误:上次gc运行报告了以下内容。请更正根本原因并删除.git/gc.log。 在删除文件之前,不会执行自动清理 警告:有太多无法触及的松散物体;运行“git prune”删除它们 实际上,删除.git/gc.loc并调用可以解决问题。 然而,在对的评论中,作者指出: […]我确实喜欢将松散的物体保留两周的安全性,我是否应该回去看看一些旧的修订版[…] 在一个关于从SVN移动到git-by后带有松散

我使用的是本地Git回购协议,该协议使用我们公司的SVN回购协议作为来源

我经常收到这样的信息:

错误:上次gc运行报告了以下内容。请更正根本原因并删除.git/gc.log。 在删除文件之前,不会执行自动清理

警告:有太多无法触及的松散物体;运行“git prune”删除它们

实际上,删除
.git/gc.loc
并调用可以解决问题。
然而,在对的评论中,作者指出:

[…]我确实喜欢将松散的物体保留两周的安全性,我是否应该回去看看一些旧的修订版[…]

在一个关于从SVN移动到git-by后带有松散对象的组织的问题(也是by)中,写道:

  • 运行git prune并祈祷它没有破坏东西(谢天谢地,它没有)
所以,我认为这是一个危险的行动,可以破坏东西

为了安全地处理“太多无法触及的松散对象”,我有以下问题:

是什么导致这些松散的对象(请参阅关于不可访问对象和关于git对象和哈希的内部工作原理以及git gc、git prune和git repack的原因)
只是:

  • 读取git提交对象
  • 将其发送到SVN服务器
  • 检索存储的SVN修订
  • 创建反映SVN修订版的新git提交对象
  • 将指向步骤1中提交的头指针替换为指向步骤4中提交的头指针,然后
  • 将原始提交保留为松散对象
  • 这确实会导致松散提交吗?
    这是否会导致所有松散的提交(我还对SVN中尚未出现的内容执行一些git树操作,例如
    git stash
    git cherry pick
    git rebase
    ,以及
    git reset

    我什么时候需要这些松散的东西? 在我的个人git repo上使用什么好策略?

    在git中,所有新对象一开始都是“松散”对象。(我一点也不清楚你为什么会犯这么多错误。)

    有一个管道命令,
    git hash object
    ,可以创建任何类型的新对象。其他命令本质上是为所需的对象类型内置
    git hash object
    ,例如,
    git write tree
    使用索引创建一些树对象,而
    git commit tree
    创建一个提交对象。使用
    git add
    为每个添加的文件创建一个松散对象;显然,在某些情况下,这可能是许多对象

    因此,创建大量松散对象非常容易,但通常,这样做的Git命令也会运行
    Git gc--auto
    自动打包它们。安全打包后,
    git prune
    会移除松散的:

    因此,我假设git prune是一个危险的操作,它可以破坏东西

    这并不特别危险,只要您在运行它的同时不做任何其他事情(例如,不运行任何可能会主动创建松散对象的Git命令)。添加
    --expire 14.days.ago
    使其保留最近创建的松散对象,而这正是
    git gc
    所擅长的,它使用您的
    gc.prueexpire
    设置,但默认为
    14.days.ago


    如果您正在积极地处理Git本身,并且在打包程序中引入了一个bug,那么它就会变得很危险。:-)基本上,每次删除冗余时,都需要确保它实际上是冗余的。

    错误消息可能更多地是关于对象的不可访问部分,而不是对象是松散的还是打包的。但你可能比我更了解git。问题是否缺少有助于确定错误消息原因的信息?我不确定您还可以提到什么。我以前见过这种情况(在另一个StackOverflow问题中),不清楚是什么导致了所有的松散对象,但将默认到期日从2周/14天缩短到更短的时间似乎已经解决了问题。本质上,
    git gc
    过于保守:如果有“太多”(对于“太多”的某些值)松散对象,它将停止自动收集它们,随着时间的推移,它会产生越来越多的松散对象,直到你注意到你的存储库不断膨胀。你链接到的GitLab问题似乎是在GitLab中做出的一个不幸的设计决定的结果,在Git看不到原始哈希ID的情况下使用原始哈希ID,然后被Git将GC(最终)未引用(到Git)的事实吓了一跳物体。所以至少有一些版本的GitLab已经完全禁用了自动gc(!)。如果您不使用GitLab,那么这与问题没有任何关系问题是,一旦某个东西制造了“太多”松散对象,没有自动gc会修复它。