修复损坏的Git仓库

10

我的工作git仓库出现问题,无法跟踪其中的所有文件,例如:

$ git log
致命错误: 默认修订版本 'HEAD' 不好  
$ git status  
... 告诉我所有文件都是新的

然而,.git目录包含我的对象。

$ du -sh .git
34M    .git
$ git count-objects
4151个对象,32692千字节。
$ git --version
git版本1.6.0.4

在它出问题之前,我记得做的最后一件事是在一个NFS挂载的服务器上创建(克隆--镜像)备份仓库。但是克隆下来的备份仓库也同样有问题。

我该如何恢复我的仓库?


你的代码库里有一个 master 分支吗?另外,使用 git log --all 命令会得到不同的结果吗? - Tim Henigan
不,'git branch -a' 对我没有任何帮助。 - Eyoka
5个回答

10

克隆以外一定有其他东西,但我知道记这些事情有多困难。

首先,您需要查看`.git/refs`并查看其中是否有任何有效信息(由于您说似乎没有分支,因此我不太乐观,但还是值得一试)。如果存在任何有效引用,则可以从git-reflog获取一些信息。

接下来,我将开始查看git-fsck。其主要目的是验证数据库中对象的连通性和有效性。根据您的存储库出现了什么情况,您可能需要使用--unreachable--lost-found选项。希望对象完好无损,这样您只需要找到一些悬空的提交哈希以检出并重新创建分支。


谢谢。我已经手动修复了存储库。结果发现分支(.git/refs/heads中的文件)丢失了,但对象仍然完好无损。我能够从.git/logs/HEAD获取每个分支末尾的提交哈希,并使用它们重新创建分支文件。当时我不知道git-fsck命令。然而,我仍然很好奇这是怎么发生的,显然我没有执行< pre>git branch -d </ pre>。我不知道很多git命令,我记得做的唯一命令是< pre>git reset </ pre>和< pre>git remote rm ...</ pre>。 - Eyoka

3

请尝试检查.git/目录下的每个文件是否属于当前用户。

我曾经遇到同样的问题,当意识到我使用root用户提交了一些提交时,它创建了属于root的对象(在.git/objects下),导致以普通用户身份运行git时出现错误。

这个命令解决了这个问题:

sudo chown jb:jb .git/ -R *

1
我刚刚在 GitHub 应用程序 (PC) 崩溃后遇到了这个问题。当使用 git branch 时,我的分支消失了,并且一直提示我进行初始提交。我通过在 .git/refs/heads/ 中定位我的分支并将其从 mybranch.lock 重命名为 mybranch(删除锁定)来解决它。

这个答案对我的情况有所帮助。我一直在使用GitHub for Windows,突然间它把仓库中的每个文件都当作新文件处理了。git log 返回了“fatal: bad default revision 'HEAD'”错误。git fsck 返回了一堆悬空提交。我只需要将文件 master.lock 重命名为 master 即可。 - Amadeusz Wieczorek

1

你可以手动检查,但这需要对存储库的格式有一定的了解。

不查看存储库很难确定发生了什么,但可能是某个文件损坏了。

运行 git fsck 命令,它会告诉你存储库是否仍然有效。

发布 git fsck 命令的结果,这应该能帮助我们帮助你。


0

在一个集中式仓库的裸主分支内,开发人员执行了$ git init命令后,我遇到了这个问题。

如果你正在使用没有工作目录的代码库,请检查是否存在.git文件夹;删除它应该可以解决这个问题。


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