Gitlab 物体松动的原因是什么?“git prune”可以安全地删除它们吗?
我使用的是本地Git回购协议,该协议使用我们公司的SVN回购协议作为来源 我经常收到这样的信息: 错误:上次gc运行报告了以下内容。请更正根本原因并删除.git/gc.log。 在删除文件之前,不会执行自动清理 警告:有太多无法触及的松散物体;运行“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/gc.loc
并调用可以解决问题。然而,在对的评论中,作者指出: […]我确实喜欢将松散的物体保留两周的安全性,我是否应该回去看看一些旧的修订版[…] 在一个关于从SVN移动到git-by后带有松散对象的组织的问题(也是by)中,写道:
- 运行git prune并祈祷它没有破坏东西(谢天谢地,它没有)
只是:
这是否会导致所有松散的提交(我还对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会修复它。