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

How does my git repository keep getting corrupted?

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

有时我会更改分支、编辑文件并输入 git 状态。它会将一堆文件显示为 "modified" 实际上根本没有改变。

如果我输入以下内容:

$ 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

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

这是怎么回事?

不知道发生了什么(除了注意到显而易见的事情之外,有些东西正在破坏你的 git 存储库),但我知道我如何解决这样的问题 - 我希望这是一个隐含的问题!

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

我更喜欢上面的方法而不是使用回购协议本身。但如果你坚持(我会先做一个备份):

  • 请注意,悬挂的 blob 和提交可能根本没有问题 - 参见例如here。短读应该不会发生。
  • git gc --prune=now 将修剪所有悬挂的 blob 和提交。
  • Here维护和数据恢复教程。

就目前的情况而言,我遇到了问题

  • NFS 安装的主目录包含 git 树,当 NFS 服务器不可靠时
  • 不区分大小写的归档系统
  • 断电/系统崩溃导致 FS 损坏,或在提交中途发生
  • 系统中有不明小鬼

第一个和第二个要避免重复很容易,第三个可以理解,但第四个往往很棘手。午夜后避免进食。