计算机死后Git存储库损坏


94

我的计算机坏了,现在我的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

您可以检查是否.git/refs/heads/master存在,并且其内容是否是存储库的有效提交哈希(可以使用进行检查git show <hash>)?

我知道这很明显,但是仍然在问-您是否有相同git repo的任何远程存储库?
Tuxdude

@戳内容.git/refs/heads/master/是一堆^@
vainolo 2013年

@Tuxdude是的,但未更新为我的最新更改
vainolo 2013年

1
是什么git reflog告诉你吗?你试过跑步git fsck吗?
kynan 2013年

Answers:


173

我设法通过以下方法恢复:

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

就我而言,这是因为我删除了一些本地和远程分支(以某种方式使.git / refs / remotes / origin / HEAD文件保持不一致的状态)。更改上述文件的内容以指向现有的本地分支(例如ref:refs / remotes / origin / master)解决了此问题。不过,由于HEAD可能指向不在当前分支中的提交,因此上述方法可能会更好。
crissdev

如果问题发生在特定的git子模块上,则第一个命令会稍微更改为rm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
Gobe

1
我必须做rm -rf .git/refs/remotes/origin,但是您为我指明了正确的方向
Jacka

23

首先按照“ 恢复损坏的git存储库”中建议的步骤进行操作:

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

希望这将使您弄清楚该master引用应该是什么,以便可以将其还原(即将正确的SHA1放入.git/refs/heads/master)。

如果该提交中包含的任何对象确实遭到破坏,那么您将无法HEAD不幸地恢复您的提交。假设您的工作树和/或索引是完整的,您可以尝试对先前的提交执行git reset --soft(或失败执行git reset),然后重新执行提交。避免进行任何更改工作树sa git checkout -f或的操作git reset --hard


我看着.git/logs/refs/heads/mybranch。它显示了对该分支的某种提交历史。仔细研究发现我选择了SHA,并尝试将其显示为git show。(每个提交都有两个SHA,我选择了第二个,正好在作者的名字之前。)最后一个已损坏,但之前的那个可能是git shown,因此我可以用来推动它git push origin abcdef:mybranch
Ed Avis

12

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

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

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

它是空的,而此文件夹中的其他分支文件在其中包含长字符串。

注意:我没有任何更改/提交

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

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


6

如果修改后的文件不多,我认为解决此问题的简便方法是:

  1. 备份您在存储库中修改的文件
  2. 删除您现有的仓库
  3. 从服务器重新克隆
  4. 将步骤1中的文件粘贴到仓库中,然后 git commit -a

是的,没有人想到重新克隆。很棒的建议
SelmanGenç17年

5

我设法通过删除git \ refs \ heads目录中的主文件来解决此问题


这有所帮助,它从我在intellij上的列表中删除了该分支,然后将其签出为新分支。幸运的是,我已经推动了我的更改,所以它们都在那里。
OAM,

4

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

事后git fsck提到该分支机构有一个error: Invalid HEADrefs/heads/<branch>有一个invalid sha1 pointer

遵循此处的选项后,我.git/refs/heads/<branch>在notepad ++编辑器中打开,每个sha1字符均为NUL

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


2

我很白痴,忘记了推送,执行提交时计算机崩溃了。我可以通过打开.git / logs / refs / heads /来恢复除最后一次提交以外的所有内容

该文件包含对分支的所有提交(及其SHA),我所做的恢复是:

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

因此,即使您犯了一个愚蠢的错误,使用git进行一整天的工作也不会立即退缩:)


1

我知道这是一个太迟的响应,但是由于没有,所以我收到了此错误origin/head。您可以通过运行找出答案git branch -r。如果看不到origin/head指向远程原点的指向,可以通过运行进行设置git remote set-head origin {{your branch name}}

现在git branch -r再次运行,您应该看到类似以下内容: origin/HEAD -> origin/develop

希望这对遇到此问题的其他人有所帮助。


1

由于无法锁定引用错误,我无法签出我的master分支。我最终删除了: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

并调用以下git命令:

git fetch --all

1

如果我会在某人之后再说一次,请原谅我(我尚未阅读所有反馈)。在我看来,解决问题的最简单方法是复制没有.git和.idea的项目,清理它,从git克隆,删除除上述目录外的所有内容,然后使用.git和.idea将先前的副本粘贴到新创建的仓库中。希望确实有道理。


1

我的计算机崩溃了两次,结果是我的git存储库在本地损坏了。我无法撤消更改,它要求设置远程原点,但是在gitKraken中不起作用。

在命令提示符下,出现此错误 在此处输入图片说明

我知道我的引用已损坏,需要修复。我要做的是git bash(在SourceTree中,单击“终端”)。然后像这样导航到引用文件夹

cd .git
cd refs
cd remotes
cd origin

那里会有一个文件名master,用于ls查看目录中的内容。然后只需使用rm master删除它

bam,损坏的文件不见了。现在,如果您发出git branch命令-a,它将输出

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

然后发出此命令,它将修复您的引用

$ git remote set-head origin master

总结起来,如果您尝试拉动遥控器,它应该显示已修复的空白遥控器名称。

在此处输入图片说明


0

我遇到了同样的问题,但是没有运气,无法解决问题。我将存储库放到一边,从服务器重新克隆了存储库,并尝试在它们之间合并。当然,它显示了许多与我的分支无关的文件,但有助于隔离所需的文件。


0

检查MSWindows是否创建了困扰git的desktop.ini文件?它为我做。一旦将它们全部删除到.git目录的子文件夹中,便可以使用。


0

当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\目录(包括子目录)中文件的内容与另一个正常项目中文件的相应文件的内容(例如),我找到了该解决方案C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\

您可能有一个损坏的其他文件,但是通过与另一个运行正常的项目进行比较,您应该能够快速发现问题所在。

如果您没有另一个配置了git的健康项目,则值得以创建破碎项目的方式创建一个简单项目,以便进行调查,比较和修复等。

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 --

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.