计算机死亡后,Git存储库损坏

我的电脑死了,现在我的一个git仓库被破坏了。 当我尝试结帐的主人告诉我:

warning: ignoring broken ref refs/heads/master. error: Your local changes to the following files would be overwritten by checkout: com.vainolo.jdraw2d.releng.p2/pom.xml Please, commit your changes or stash them before you can switch branches. Aborting 

当我执行git stash我得到:

 fatal: bad revision 'HEAD' fatal: bad revision 'HEAD' fatal: Needed a single revision You do not have the initial commit yet 

那么…我能做什么?

更新 git reflog输出:

 fatal: bad default revision 'HEAD' 

不是很有前途… git fsck输出:

 error: Invalid HEAD Checking object directories: 100% (256/256), done. error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header error: inflateEnd: stream consistency error (no message) fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt 

我设法恢复通过:

 rm .git/refs/remotes/origin/HEAD git fetch --all 

首先按照恢复损坏的git存储库中build议的步骤操作:

  • 检查.git/refs是否仍然包含有用的东西
  • 检查git reflog和失败的.git/logs/refs/heads/master或您最后一个分支的内容
  • 运行git fsck ,可能使用--unreachable--lost-found

这将有希望让你找出master ref应该是什么,所以你可以恢复它(即猫正确的SHA1到.git/refs/heads/master )。

如果该提交中包含的任何对象真正损坏,则不幸的是不能恢复您的HEAD提交。 假设你的工作树和/或索引是完好的,你可以尝试一个git reset --soft (或者失败的git reset )到前面的提交,然后重新提交。 避免任何改变你的工作树的操作git checkout -f或者git reset --hard

在Windows 8.1上遇到蓝屏死机后,我遇到了类似的问题

我在这个位置有一个文件…

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

它是空的,而这个文件夹中的其他分支文件在它们内部有长string。

NB我没有任何更改/提交

  • 我备份了<problem-branch>文件
  • 删除了该文件
  • git fetch --all重新获得分支

然后标签自动完成再次开始工作

如果修改的文件不多,我认为解决这个问题的方法是:

  1. 备份您在回购中修改的文件
  2. 删除您现有的回购
  3. 从服务器重新克隆它
  4. 将步骤1中的文件粘贴到回购站,并将git commit -a

我有同样的问题,但没有运气,无法找出问题。 我把我的回购一边,重新克隆从服务器的一个,并试图合并他们之间。 当然,它显示了很多文件与我的分支没有关系,但有助于隔离所需的文件。

检查MSWindows是否创build了兼容git的desktop.ini文件? 它为我做。 一旦我把它们全部删除在.git目录的子文件夹中,那么它就起作用了。

当Android Studio突然终止时(由于电脑断电),我也遇到了同样的问题。

我通过将我的C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\master文件的内容复制到我的C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\master文件。

(之前,我还打开了Android Studio中的“强制推送”选项,但我不认为这是必要的步骤。)

注意:

我通过将我的C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\目录(inc。子目录)中的文件内容与另一个健康项目中的文件的相应文件(例如C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\

你可能有一个不同的文件是腐败的,但通过比较另一个健康的项目,你应该能够迅速发现什么是错的。

如果你没有一个健康的项目configuration好git,那么创build一个简单的项目也是值得的,就像创build你的破坏项目一样,这样可以调查,比较和修复等等。

PS – 我的错误消息(编辑)是: warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --

我知道这是一个太迟的反应,但我得到这个错误,因为我没有一个origin/head 。 你可以通过运行git branch -r来find它。 如果你没有看到你的origin/head指向一个远程原点,你可以通过运行git remote set-head origin {{your branch name}}

现在再次运行git branch -r ,你应该看到这样的东西: origin/HEAD -> origin/develop

我希望这可以帮助那些遇到这个问题的人。

由于无法lockingref错误,无法检出我的主分支。 我结束了删除: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

并调用这个git命令:

 git fetch --all 

经过计算的冻结和崩溃后,我的git分支被破坏了: git fatal: your current branch appears to be broken 。 我什么都做不了

之后做git fsck提到分支有一个error: Invalid HEADrefs/heads/<branch>有一个invalid sha1 pointer

按照这里的选项,我在记事本++编辑器中打开了.git/refs/heads/<branch> ,每个sha1字符都是NUL

幸运的是,我只需要将分支重置为远程状态,这是在一个bitbucket回购。 我从远程回购的尖端抓住了sha1,并复制到.git/refs/heads/<branch>保存,然后执行git reset --hard HEAD ,一切恢复正常。

我是白痴足以忘记推,我的电脑在执行提交时崩溃。 我可以通过打开.git / logs / refs / heads /

这个文件包含到分支的所有提交(与他们的SHA),我做的恢复是:

  • 将最新更改备份到临时文件夹
  • 转向“干净的石板”
    • git checkout master
    • git reset --hard
  • 签出日志中的倒数第二个提交
  • 从这个分离的头创build一个分支
  • 还原最新的更改
  • 再次提交

所以即使你犯了一个愚蠢的错误,你也不会立即被git的一整天工作带回来:)