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

问题描述 投票:0回答:1

我正在使用当地的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)到的问题 - jlengrand从SVN移动到git之后关于VonCissue与松散物体的问题 - git prune写道:

  • 运行git prune并祈祷它没有破坏事物(幸好没有)

因此,我认为man git-fsck是一种危险的操作,可以摧毁事物。

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

是什么导致这些松散的物体(参见torek关于无法到达的物体,并看到answergit gc - 关于git对象和哈希和git prunegit repackWhat does git do when we do : git gc - git prune的内部运作 - 由Lyes CHIOUKHgit svn push)? 只有git stash

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

这确实会导致松散的提交吗? 这是否会导致所有松散的提交(我还会对SVN中尚未存在的东西进行一些git树操作,例如git cherry-pickgit rebasegit resetgit prune)?

我什么时候需要这些松散的物体?在我的个人git仓库中使用git hash-object的好政策是什么?

git git-svn
1个回答
1
投票

在Git中,所有新对象都以“松散”对象开始。 (我一点也不清楚你为什么会得到太多错误。)

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

因此,创建大量松散对象非常容易,但通常Git命令执行此操作,也运行git prune自动打包它们。一旦它们安全地被打包,git prune将松散的那些移除:

因此,我认为--expire 14.days.ago是一种危险的操作,可以摧毁事物。

它并不是特别危险,只要你在没有做任何事情的情况下运行它(即,没有运行任何可能主动创建松散对象的Git命令)。添加git gc使它保留最近创建的松散对象,这就是gc.pruneExpire所做的 - 好吧,它使用你的14.days.ago设置,但默认为qazxswpoi。

如果你正在积极研究Git本身,并在包装​​程序中引入一个bug,那么它就变得很危险了。 :-)基本上,每当你删除冗余时,你需要确保它实际上是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.