2014-09-26 65 views
1

当我想运行git branchgit log或在我的仓库我对着下面的错误其他命令:Git的参头文件是无效的

fatal: Failed to resolve HEAD as a valid ref. 

当我打开.git/HEAD我看到分支我期待,因为它是最后一个我工作:

ref: refs/heads/refactoring 

当我在.git/refs/heads/打开任何文件,我总是觉得有了这样的字符串单行:

2d73344af3d39ab9c89df71f6696a1b0b65cdca9 

但是,如果我打开.git/refs/heads/refactoring所有我看到的是一堆零:

0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 00 

所以很明显的Git不能在该分支时,有在它的头文件中没有信息进行操作。

于是两个问题:

  1. 这怎么会发生?
  2. 如何以正确的方式恢复它?

我问一个适当的方式,因为所有我能想到的是:

  1. 由于损坏的分支仍然签出,手动进行的所有文件的副本。
  2. 将HEAD文件中的ref更改为工作分支。
  3. 删除损坏的分支。
  4. 签出具有相同或不同名称的新分支。
  5. 添加备份中的文件并提交。

但是,这听起来太hacky为我的口味。

任何想法?

+0

您不必手动复制文件。只需创建一个新的(临时)分支。 – musiKk 2014-09-26 09:22:41

+0

我不能在HEAD仍然指向无效分支 – Amberlamps 2014-09-26 09:44:11

+0

不幸的是,我不能重现这个问题,如果我尝试,我会得到不同的错误消息。但是,我认为你的解决方案如果有效就不好。您处于损坏的存储库中,因此您可能需要执行一些不寻常的步骤才能修复它。如果它有效,您也可以将其作为答案。它可能会帮助其他有相同问题的人。 – musiKk 2014-09-26 09:50:49

回答

2

我能够恢复我的分支,这里是我是如何做的:

  1. 我做了我的文件的备份。
  2. 由于回购仍在损坏的分行结帐,我无法在使用git checkout validbranch的分行之间更改。我不得不通过命令行设置分支:echo ref: refs/heads/validbranch > .git/HEAD
  3. 很显然,我在损坏的分支中所做的所有更改现在都可以在validbranch中看到,而实际上它们不应该是这样。
  4. 我创建了一个新分支restorebranch并希望将更改提交给该分支。但是,抛出以下错误:error: inflate: data stream error (unknown compression method) error: unable to unpack 5ec6c4d5cdec15d206058ed6a475eb735f788ab8 header fatal: 5ec6c4d5cdec15d206058ed6a475eb735f788ab8 is not a valid object
  5. 因此,我运行git fsck --lost-found其中指出我损坏的文件:fatal: loose object abe0fd1236d488160187b91dbf4adeed31104355 (stored in .git/objects/ab/e0fd1236d488160187b91dbf4adeed31104355) is corrupt。我手动删除了该文件。我不得不多次运行git fsck --lost-found,因为它只能指出您一次损坏了一个文件。我需要手动删除大约10个损坏的文件。
  6. 最后我能承诺到restorebranch。我将备份粘贴到我的工作目录中。令我惊讶的是,我的工作部门没有出现任何变化。所以我不知道我真的删除了什么样的对象。
  7. 当我想要使用git branch -D删除已损坏的分支时,它告诉我error: branch 'refactoring' not found.,尽管在运行git branch时它清晰可见。为了解决我手动删除.git/refs/heads/corruptbranch

一切都恢复正常了,但有可能仍然是曾经属于corruptedbranch现在已经在地狱失去了我的.git目录一些死,不可达的对象。

+0

大约每两周清理一次,所以物体应该能够平静地休息。 – 2014-09-26 10:34:59

+0

Btw。因为你只碰过git目标文件,所以你的工作树(你备份的文件)没有改变。你可能丢失了一个你删除的提交对象,但是因为你没有进行硬重置或者检查你的工作树中的任何文件没有被触及。我希望这是可以理解的,希望澄清你的困惑。 – 2014-09-26 10:37:20

+0

好的,也许我失去了我对损坏的分支所做的所有提交对象?!我删除了大约10个对象。它与我对该分支所做的提交数量相加。 – Amberlamps 2014-09-26 10:39:24

相关问题