物体松动的原因是什么?可以通过git prune安全删除它们吗?

时间:2018-08-30 09:58:38

标签: git git-svn

我使用的是本地Git仓库,该仓库使用我们公司的SVN仓库作为来源。

我经常收到以下消息:

  

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

     

警告:有太多无法到达的松散物品;运行“ git prune”将其删除。

实际上,删除.git/gc.loc并调用git prune可解决此问题。
但是,在VonCanswerHow to skip "Loose Object" popup when running 'git gui'Michael Donohue的评论中,Michael Donohue指出:

  

[...]我喜欢将松散的物体放置两周的安全性,如果我想回过头来看看一些旧版本[...]

answer(也由VonC)到Whole team gets 'too many unreachable loose objects' messages中–一个关于从SVN移到git后带有松散对象的问题–由{{3} },jlengrand写道:

  
      
  • 跑了git prune并祈祷它没有破坏事情(幸运的是它没有破坏)
  •   

因此,我认为VonC是一种危险的操作,它会破坏事物。

为了安全处理“太多无法到达的松散物体”消息,我有以下问题:

是什么原因导致这些松散的对象(有关无法访问的对象,请参见git prune;有关git对象和哈希的内部工作原理,请参见man git-fscktorek; { {1}}和git gc —由answerWhat does git do when we do : git gc - git prune)?
只是Lyes CHIOUKH

  1. 读取git commit对象,
  2. 将其发送到SVN服务器,
  3. 检索存储的SVN版本,
  4. 创建一个反映SVN版本的新的git commit对象,
  5. 将指向步骤1的提交的HEAD指针替换为指向步骤4的提交的
  6. 将原始提交作为一个松散对象。

这确实会导致松散的提交吗?
会导致所有松散的提交吗(我还会对SVN中尚未使用的东西(例如git prunegit repackgit stashgit cherry-pick进行一些git树操作)?

我什么时候需要这些松散的物品? 在我的个人git repo上使用git svn push有什么好的政策?

1 个答案:

答案 0 :(得分:1)

在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.pruneExpire设置,但是默认为14.days.ago

如果您正在积极研究Git本身,并将错误引入打包程序中,那么然后会很危险。 :-)基本上,每次删除冗余时,都需要确保它是实际上是冗余的