我正在使用当地的Git仓库,它使用我们公司的SVN仓库作为原产地。
我经常收到这样的信息:
错误:最后一次gc运行报告了以下内容。请更正根本原因并删除.git / gc.log。在删除文件之前,不会执行自动清理。
警告:有太多无法到达的松散物体;运行'git prune'删除它们。
确实删除.git/gc.loc
并调用git prune
解决了这个问题。
然而,在VonC对answer的How to skip "Loose Object" popup when running 'git gui'到Michael Donohue的评论中,Michael Donohue说:
[...]我确实喜欢将松散物体保持两周的安全方面,如果我想回去查看一些旧的修订[...]
answer写道:在VonC(也是Whole team gets 'too many unreachable loose objects' messages)到gitlab的问题 - jlengrand从SVN移动到git之后关于VonCissue与松散物体的问题 - git prune
写道:
- 运行git prune并祈祷它没有破坏事物(幸好没有)
因此,我认为man git-fsck
是一种危险的操作,可以摧毁事物。
为了安全地处理“太多无法到达的松散物体” - 消息我有以下问题:
是什么导致这些松散的物体(参见torek关于无法到达的物体,并看到answer的git gc
- 关于git对象和哈希和git prune
,git repack
和What does git do when we do : git gc - git prune的内部运作 - 由Lyes CHIOUKH到git svn push
)?
只有git stash
:
这确实会导致松散的提交吗?
这是否会导致所有松散的提交(我还会对SVN中尚未存在的东西进行一些git树操作,例如git cherry-pick
,git rebase
,git reset
和git prune
)?
我什么时候需要这些松散的物体?在我的个人git仓库中使用git hash-object
的好政策是什么?
在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,那么它就变得很危险了。 :-)基本上,每当你删除冗余时,你需要确保它实际上是多余的。