git fsck分段故障排除

时间:2019-04-01 13:53:09

标签: git git-fsck

我在Rubymine中使用git。再次提交后,我打开了git push窗口,看到了object file .git/object/55/4d...e6 is emptyunable to read ....而不是提交名称。

运行git fsck -full给了我这个: Segmentation faultrectories: 33% (85/256)

在这里我能做些什么吗?

1 个答案:

答案 0 :(得分:0)

Git 2.25(2020年第1季度)应该解决一种可能的git fsck段故障原因。 该命令在对象解析和低级对象访问方面随着时间的推移积累了繁琐的代码和逻辑,该问题已得到修复。

请参见commit b2f2039commit c5b4269commit 103fb6dcommit f648ee7commit cc57900commit 7854399commit b8b00f1,{{3} },commit 6da40b2commit 3837025commit f597937commit 5afc4b1commit 82ef89bcommit 7339029commit d40bbc1commit a59cfb3commit 23a173acommit 2175a0ccommit ec65231commit 1de6007commit 78d5014commit 12736d2(2019年10月18日)和commit c78fe00(10月25日2019)由commit 228c78f
(由Jeff King (peff)Junio C Hamano -- gitster --中合并,2019年12月1日)

  

commit 0e07c1c:将lookup_commit()失败视为解析错误

     

签名人:杰夫·金

     

在解析提交的父对象时,如果我们能够解析实际的oid但lookup_commit()却失败了(因为我们之前在此过程中将其视为不同的对象类型),我们会默默地忽略父对象并且不要向呼叫者报告任何错误。

     

调用者无法知道是否发生了这种情况,因为即使是空的父列表也是有效的解析结果。结果,可以欺骗我们的“ rev-list”连接检查来接受一组损坏的对象。

这导致:

  

parse_commit_buffer():将NULL标记指针视为解析错误

     

签名人:杰夫·金

     

在解析标签时,如果类型不匹配(例如,标签声称指向对象NULL作为提交,我们可能会以X“已标记”字段结束)但我们之前在同一过程中将X视为Blob),但是我们没有以其他方式向调用者表明解析失败

     

这与上一次提交中讨论的情况类似,在上一次提交中,提交可能以NULL树字段结尾:对于希望忽略损坏对象的调用者来说,虽然有点方便,但这意味着普通调用者拥有明确处理这种情况(而不仅仅是依靠解析中的返回码)。
  大多数情况不会,会导致段错误修复,例如parse_tag_buffer()中的一个(“ use get_tagged_oid()”,2019-09-05,Git v2.24.0-rc0- c77722b3ea中列出的merge

     

让我们通过从解析本身返回错误代码来更集中地解决这个问题,大多数调用者已经注意到了(冒险的调用者可以随意忽略该错误并继续查看结构)。

     

这也涵盖了标签包含一个荒谬的“类型”字段的情况(我们产生了用户可见的错误,但仍然向调用者返回成功;现在我们将产生一条更好的消息并返回错误)。

作为更好的错误消息的一部分:

  • 不再存在段错误
  • 指向yyy中的'xxx'的错误标签指针
  • 或:xxx中未知的标记类型'yyy'