计算机死亡后,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中的文件粘贴到回购站,并将
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 HEAD
。 refs/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的一整天工作带回来:)