如何从已损坏的git工作目录中恢复文件

6
我不幸在切换尚未推送到远程仓库的Git分支时遇到了蓝屏死机的情况。在计算机重新启动并登录后,我发现我的工作区已经损坏了。以下是一些症状:
  • 分支名称为“(...)”
  • .git目录存在,并包含标准文件和目录(hooks、info、logs、objects、refs)
  • 除克隆和初始化之外,我执行的所有git命令都会出现“fatal: Not a git repository (or any of the parent directories): .git”
  • “$ git init”没有报错,但也没有解决问题
  • “$ git fsck --full”导致“fatal: Not a git repository (or any of the parent directories): .git”
  • 工作区中只有一些目录显示了TortoiseGit图标,表示没有更改,其他目录则没有这些图标,所有文件都没有这些图标

有人能帮我将工作区恢复到正常状态或者找回分支或存储的一些文件吗?


我没有阅读过这个,但也许它会给你一些帮助。http://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery - Dmitry Koroliov
我理解的是,您使用的是Windows操作系统,在Windows上运行某种bash,并且除了git init命令之外,其他命令都无法正常工作,尽管您的项目文件夹中有.git文件夹。 - Dmitry Koroliov
没错,我正在使用Windows7操作系统,已经下载并安装了Git客户端二进制文件(其中包含一个Bash模拟器),还安装了一些GUI界面(TortoiseGit和Git Extensions)。是的,有一个.git文件。 - Roy B
抱歉,我不知道如何处理这个问题。我从未听说过类似的事情。最后,我建议你寻找类似于我上面发布的链接的信息,并尝试对剩余在你的.git文件夹中的内容做出一些处理。 - Dmitry Koroliov
你试过克隆你当前的本地(受损)仓库,只是为了检查新的本地克隆是否会出现相同的错误吗? - VonC
是的,我们尝试了,但它无法识别源作为git仓库。 - Roy B
3个回答

9
通过我以前的同事的帮助,我找到了解决方法。你最好将其视为最后的手段,因为你可能会丢失一些信息,并且由于损坏可能无法正常工作。
让我们将已损坏的工作区命名为“corruptWorkspace”,要修复的工作区命名为“fixWorkspace”。 第一步是创建一个新的工作区来进行恢复并复制对象和引用:
1. $ mkdir fixWorkspace 2. $ cd fixWorkspace 3. $ git init 4. $ cp ../corruptWorkspace/.git/objects .git -r -a 5. $ cp ../corruptWorkspace/.git/refs .git -r -a
从这里开始,您可以恢复分支/提交。
6. 通过在.git\refs\heads或.git\logs\HEAD文件中查找它来找到要恢复的分支。 7. 在文本编辑器中打开,您将在分支文件中找到该分支的最新提交SHA,或者在HEAD文件中找到分支的最后一条记录的第二个SHA列。
此命令应可读并显示最后提交的更改。
8. $ git show [commit SHA]
确认分支看起来没问题后,请尝试将其检出。
9. $ git checkout [branch name]
然后您可以重置该分支。
10. $ git reset --hard
此时,您拥有该分支的最新提交版本。下一步是恢复存储文件。
11. 通过在.git\refs\stash或.git\logs\stash文件中找到它来找到要恢复的存储。 12. 在文本编辑器中打开,您将在存储文件中找到该存储的最新提交SHA,或者在存储文件中找到分支的最后一个存储记录的第二个SHA列。
列出要恢复的存储文件中的文件,从这里您可以获取已存储的位置和文件以用于还原文件。
13. $ git show --name-only [stash SHA]
恢复存储的文件。
14. $ git show [stash SHA]:[full path of file] > [full path of file]
完成上述命令后,您已经获取了您的分支和存储的文件。如果配置文件未损坏,则甚至可以复制“origin”定义并推送更改。
祝你好运

另一个可能的原因是您的索引文件已损坏。解决方案在这里 - Roy B
非常感谢Roy B,我已经恢复了所有的功能分支。 - Parag

1
今天早上我遇到了一个本地仓库的同样问题,这在我使用Git多年来从未出现过。我已经使用这个特定的repo 4个月了,但现在它告诉我它不是一个git仓库,而所有的目录和文件(包括.git)都在那里。我的机器(Windows 7)晚上会自动关闭,原因不明,这可能导致一些损坏,因为我倾向于一直打开Intellij。我的git版本是1.9.4。我尝试了“git init”重新初始化本地仓库,但没有帮助。我将Git更新到版本1.9.5,也没有帮助。本地仓库仍然有我的本地设置(git config --local -l)。幸运的是,我经常提交和推送我的分支,所以恢复就像重新克隆一样容易,但这仍然让我感到困惑。我将现有的本地仓库重命名为其他名称,然后重新克隆远程仓库,现在新的克隆正常了(旧的仍然无法使用)。

1
这不是问题的答案。 - toolforger

1
当我在从一个分支检出到另一个分支时,我的电脑由于停电而关机,当我重新启动电脑时,发现我的代码库已经损坏。我将代码库克隆到一个新文件夹 "new clone" 中。根据 "Roy B" 的回答,我用包含分支和其他信息的 "corrupt git folder" 替换了 "new clone" 文件夹中的文件夹:
  • ../corruptWorkspace/.git/objects
  • ../corruptWorkspace/..git/refs
  • ..\corruptWorkspace.git\logs

仓库已恢复


你能详细说明一下你实际上做了什么吗? - cloned

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接