Git refs头文件无效

时间:2014-09-26 09:11:30

标签: git version-control

当我想在我的存储库中运行git branchgit log或其他命令时,我面临以下错误:

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

很明显,当HEAD文件中没有信息时,Git无法在该分支上运行。

所以有两个问题:

  1. 怎么会发生这种情况?
  2. 如何以正确的方式恢复?
  3. 我要求一个正确的方法,因为我能想到的只有:

    1. 由于仍然检出损坏的分支,请手动复制所有文件。
    2. 将HEAD文件中的ref更改为工作分支。
    3. 删除损坏的分支。
    4. 签出一个名称相同或不同的新分支。
    5. 从备份中添加文件并提交。
    6. 但这对我来说听起来太过苛刻了。

      有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我能够恢复我的分支,我就是这样做的:

  1. 我备份了我的文件。
  2. 由于repo仍然在损坏的分支上签出,我无法使用git checkout validbranch在分支之间进行更改。我必须通过命令行设置分支:echo ref: refs/heads/validbranch > .git/HEAD
  3. 显然,我在那个已损坏的分支中所做的所有更改现在都可以在有效分支中看到,但实际上它们不应该是。
  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
  8. 现在一切都恢复正常了,但是我的.git目录中可能还有一些死的,无法访问的对象曾经属于corruptedbranch,现在已经陷入困境。