Git refs头文件无效

Git refs头文件无效,git,version-control,Git,Version Control,当我想在我的存储库中运行git branch、git log或其他命令时,我面临以下错误: fatal: Failed to resolve HEAD as a valid ref. 当我打开.git/HEAD时,我看到了我期望的分支,因为它是我最后一个正在处理的分支: ref: refs/heads/refactoring 当我在.git/refs/heads/中打开任何文件时,总会发现一行字符串如下: 2d73344af3d39ab9c89df71f6696a1b0b65cdca9 但

当我想在我的存储库中运行
git branch
git 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
所以很明显,Git不能在其头文件中没有信息的情况下对该分支进行操作

所以有两个问题:

  • 这怎么会发生
  • 如何以正确的方式恢复
  • 我要求一个合适的方法,因为我能想到的是:

  • 由于损坏的分支仍处于签出状态,请手动复制所有文件
  • 将HEAD文件中的ref更改为工作分支
  • 删除损坏的分支
  • 签出具有相同或不同名称的新分支
  • 从备份中添加文件并提交
  • 但这听起来太老套了,不合我的口味


    有什么想法吗?

    我能够恢复我的分支,以下是我是如何做到的:

  • 我备份了我的文件
  • 由于repo仍在损坏的分支上签出,因此我无法使用
    git checkout validbranch
    在分支之间进行更改。我必须通过命令行设置分支:
    echo-ref:refs/heads/validbranch>.git/HEAD
  • 显然,我在该损坏分支中所做的所有更改现在都可以在validbranch中看到,而它们实际上不应该出现在validbranch中
  • 我创建了一个新分支
    restorebranch
    ,并希望将更改提交给该分支。但这引发了以下错误:
    错误:充气:数据流错误(未知压缩方法)错误:无法解压缩5ec6c4d5cdec15d206058ed6a475eb735f788ab8头致命:5ec6c4d5cdec15d206058ed6a475eb735f788ab8不是有效对象
  • 因此,我运行了git fsck--lost-found,它指向损坏的文件:
    致命:松散对象abe0fd1236d488160187b91dbf4adeed31104355(存储在.git/objects/ab/e0fd1236d488160187b91dbf4adeed31104355中)已损坏
    。我手动删除了那个文件。我不得不运行几次git fsck--lost-found,因为它一次只能指向一个损坏的文件。我需要手动删除大约10个损坏的文件
  • 最后,我能够承诺使用
    restorebranch
    。我将备份粘贴到我的工作目录。令我惊讶的是,我的工作部门没有任何变化。所以我不知道我实际上删除了什么样的对象
  • 当我想使用
    git branch-D
    删除损坏的分支时,它告诉我
    错误:未找到分支“重构”。
    即使在我运行
    git branch
    时它清晰可见。为了修复这个问题,我手动删除了
    .git/refs/heads/corruptbranch

  • 现在一切都恢复了正常,但在my.git目录中可能仍然有一些曾经属于
    Corrupted Branch
    的死的、无法访问的对象,现在它们已消失在茫茫之中。

    您不必手动复制文件。只需创建一个新的(临时)分支。当HEAD仍指向无效分支时,我无法执行此操作。幸运的是,我无法重现此问题,如果尝试,我会收到不同的错误消息。然而,我不认为你的解决方案是黑客,如果它的工作。您位于损坏的存储库中,因此可能需要执行一些不寻常的步骤来修复它。如果它有效,你也可以提供一个答案。它可能会帮助其他有相同问题的人。您只需手动将头文件更改为指向有效分支。删除损坏的分支文件并创建一个新的分支文件。@Zeeker:我就是这么做的。但是如果我想提交曾经属于损坏分支的更改,我会得到:
    错误:充气:数据流错误(未知压缩方法)错误:无法解包5ec6c4d5cdec15d206058ed6a475eb735f788ab8头致命:5ec6c4d5cdec15d206058ed6a475eb735f788ab8不是有效的对象
    大约每两周会清除一次边界,因此对象应该可以平静地休息。顺便说一句。由于您只涉及git对象文件,所以您的工作树(您备份的文件)应该不会发生更改。您可能丢失了一个已删除的提交对象,但由于您没有进行硬重置或签出任何文件,所以您的工作树保持不变。我希望这是可以理解的,我想澄清你的困惑。好吧,也许我丢失了我对已损坏分支的所有提交对象?!我删除了大约10个对象。它加上我对该分支所做的提交的数量。提交对象指向树对象,树对象指向blob对象和其他树对象。我想有些提交出错了,所以相当多的文件被破坏了。看看gitpro书的第二部分,了解git是如何在内部管理历史的。