2009-10-09 95 views
9

我工作的git仓库被打破,失去它的轨道中的所有文件,即恢复破碎的Git仓库

 
$ git log 
fatal: bad default revision 'HEAD' 
 
$ git status 
... told me that all the files are new 

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

 
$ du -sh .git 
34M .git 
 
$ git count-objects 
4151 objects, 32692 kilobytes 
 
$ git --version 
git version 1.6.0.4 

我记得做出了差错被创建(克隆--mirror)在NFS挂载的服务器备份库前的最后一件事。然而克隆的备份库也是以相同的方式打破。

如何恢复我的存储库?

+0

存储库中是否有'master'分支?另外,你用'git log --all'得到了不同的结果吗? – 2009-10-09 19:24:51

+0

不,'git branch -a'告诉我什么都没有。 – Eyoka 2009-10-09 19:55:04

回答

8

除克隆之外,肯定还有东西,但我知道记住这些东西有多难。

你想要做的第一件事是看看.git/refs,看看里面有没有什么有效的东西(我不太乐观,因为你说没有看到任何分支,但它是值得的一枪)。如果有任何有效的参考文献,您可以从git-reflog获得一些信息。我想看看git-fsck。其主要目的是验证数据库中对象的连通性和有效性。根据您的回购确实发生了什么,您可能需要--unreachable--lost-found。希望这些对象是完整的,所以你需要做的是找到一些悬空的提交哈希来检出并重新创建分支。

+0

谢谢。我已经手动修复了存储库。事实证明,分支(在.git/refs /头文件)失踪,但对象完好无损。我能够从.git/logs/HEAD获得每个分支尖端的提交散列,并使用它们来重新创建分支文件。那时我不知道git-fsck命令。 但我仍然好奇这是怎么发生的,显然我没有做

git branch -d
。我不知道很多git命令,我记得的唯一的命令是
git reset
git remote rm ...
Eyoka 2009-10-09 23:43:33

1

您可以手动检查,但这需要有关存储库格式的一些知识。

不看存储库很难说出发生了什么,但可能有些文件已损坏。

运行git fsck,它会告诉您的存储库是否仍然有效。

发布git fsck运行的结果,这应该会帮助我们来帮助你。

1

尝试检查.git /中的每个文件是否都由当前用户拥有。

我有同样的问题,当意识到我做了一些提交与root用户,并创建对象(根据.git /对象)属于根,触发错误时运行git作为普通用户。

该命令解决了这个问题:

sudo chown jb:jb .git/ -R * 
1

我我的GitHub上的应用程序(PC)后坠毁得到这个问题刚才。当我使用git branch时,我的分支消失了,并且它一直提示我做我的初始提交。我通过在.git/refs/heads/中找到我的分支并将其从mybranch.lock重命名为mybranch(解除锁定)来解决此问题。

+0

这个答案对我有帮助。我使用GitHub for Windows,并突然将存储库中的每个文件都视为一个新文件。 git日志返回“致命:错误的默认版本'HEAD'”。 git fsck返回了一堆悬而未决的提交。我只需要重命名文件master.lock来掌握 – 2014-06-04 20:55:14

0

在开发人员在集中式回购仓库的裸机内部做了$ git init之后,我遇到了此问题。

如果您正在使用没有工作目录的存储库,请检查.git文件夹;删除这个应该纠正这个问题。