问题 我的git存储库如何不断损坏?


我使用的是ubuntu 14.10(64位),git 2.1.0版。这是一个已存在多年的存储库,最近开始出现问题。

有时我会更改分支,编辑文件,然后输入git status。它会将一堆文件显示为“已修改”,实际上根本没有改变。

如果我键入以下内容:

$ git commit -am "fixed sms message"

我得到这样的错误:

error: short read No such file or directory
error: globalstatic/images/console/avatar_f.gif: failed to insert intodatabase
error: unable to index file globalstatic/images/console/avatar_f.gif
fatal: updating files failed

如果我什么都不做,只需按向上箭头键并再次按回车键,我将收到有关显示的下一个文件的错误 git status 从未真正改变过。我可以这样做,直到我用尽了文件列表 git status 没有改变,然后它将正确提交。

git fsck --full 确实报告它发现了问题,但实际上没有修复任何问题。我只需要继续尝试,直到它工作。这是输出 git fsck --full 什么时候给我发问题:

Checking object directories: 100% (256/256), done.
Checking objects: 100% (120625/120625), done.
dangling tag c7539416829fb0748bc32dda3beb386bac46ea9a
dangling blob 88a0700db2a75e6ea2b14b9a5af15ece63a80805
dangling blob f4c664b0044f3d5efff1148717dc68b940e08574
dangling blob 1bf6185091177fd5a496f5bf031f4d666fec92da
dangling commit fee4bdcc078789a3745aa1311f128a6b61a81736
dangling blob 9f14e68da29d49895b1ea303ed33cb390fc56b76
dangling blob 784a02e974b81f35952fb7c31bf2dcb1a7bfeda8
dangling blob 9e92d6cf395206152123f9a29edb95652114fd34
dangling commit 1294f626dcb76cafa560f65792517655fb8a52ae
dangling blob bceb1adde285e71109723211a1bcb5b0fa126681
dangling tag 19f4be8e7b53465b13359bc4350b5e87c5942560
dangling blob 93f96a3b5e995032a50723af796dab9ae36fb974
dangling blob a25bdfab82fef920935478ee2cefe4dc2e81bbf6
dangling blob af7187350341f3d7795d35cc1f0cee78eb9f9fdf
dangling blob e2a1db9e3d3d438c8b03cb6254ca492e505be6f8

如果我不止一次运行它,我会收到相同的消息。没有什么变化。

到底是怎么回事?


6615
2018-02-09 20:14


起源

是时候检查你的文件系统和驱动器了,我想......不仅仅是回购。特别是因为它抱怨工作目录中的文件(除了 git fsck 问题)。 - twalberg
这是什么类型的文件系统存储?它是由Dropbox同步还是同类? - John Szakmeister
实际上,看着它更多,它看起来不像你的回购是腐败的。悬挂的物体可能是不再存在的分支的结果,也可能是因为重新定位你的工作。悬挂标签有点可疑,但可能是因为你在途中某处删除了一个标签。似乎正在发生的事情是Git不会承诺回购。你可以尝试添加 GIT_TRACE=2到命令行的开头,以获得有关正在发生的事情的更多信息。 - John Szakmeister
@jszakmeister这是一个ext4 FS。我没有通过Dropbox或任何东西同步它,虽然我确实通过虚拟机实例中的vboxsf安装它。虚拟机实例可能正在修改文件,但我不确定如何。我会尝试 GIT_TRACE 下次发生这种情况并看到。 - synic
@jszakmeister哈,我很确定我刚刚发现了这个问题。它发生在我在virtualbox中恢复快照后(我认为)。要做更多的测试,但我很确定就是这样。 - synic


答案:


不知道发生了什么(除了注意到显而易见的,有些东西正在腐蚀你的git repo),但我知道我是如何修复这样的事情的 - 我希望这是一个隐含的问题!

  • 把你的repo推到某个地方(一个本地的裸存储库就可以了)
  • 将您的旧存储库重命名为 myrepo.broken 或类似的
  • 看看你推到前一个地方的回购的新副本
  • 一旦确定没有丢失任何东西,请删除旧的仓库

我更倾向于采用上述方法来对付回购本身。但如果你坚持(我先做备份):

  • 请注意悬挂的blob和提交可能完全没问题 - 例如,请参阅 这里。简短的阅读应该是  发生。
  • git gc --prune=now 将修剪你所有悬空的blob和提交。
  • 这里这是一个关于维护和数据恢复的教程。

至于正在发生的事情,我遇到了问题

  • 当NFS服务器狡猾时,NFS挂载包含git树的主目录
  • 不区分大小写的文件系统
  • 功率损耗/系统崩溃导致FS损坏,或者在提交过程中发生
  • 系统中的身份不明的小鬼

这很容易避免第一次和第二次重复,第三次是可以理解的,但第四种往往是棘手的。午夜后避免喂食。


9
2018-02-09 20:37



我会试一试。谢谢! - synic
最糟糕的是,小鬼可能是一个非常可能的原因。可以是病毒,扫描仪,文件备份系统等,随着内容的修改,动态修改文件。需要考虑的是考虑环境中最近发生了哪些变化(你做了更新吗?你安装了新软件吗?) - sjagr