本地项目的一个git仓库损坏如何恢复,记录一次因突然断电导致.git文件损坏,无法使用问题
问题现象
1、进入git命令行,使用git命令报错
$ git status
fatal: not a git repository (or any of the parent directories): .git
2、git本身可以使用,其他项目git正常
3、.git文件夹下所有文件齐全
解决过程
1、了解各个文件作用
| 文件名 | 说明 |
|---|---|
| hooks | 存放一些sheel的地方 |
| info | 存放仓库的信息 |
| logs | 保存所有更新的引用记录 |
| object | 存放所有git对象的地方 |
| refs | 存放提交hash的地方(heads:保存当前最新的一次提交的哈希值) |
| COMMIT_EDITMSG | 最新提交的一次Commit Message,git系统不会用到,给用户一个参考 |
| config | github的配置信息 |
| description | 仓库的描述信息,主要给gitweb等git托管系统使用 |
| gitk.cache | - |
| HEAD | 映射到ref引用,能够找到下一次commit的前一次哈希值 |
| index | 暂存区(stage),一个二进制文件 |
| ORIG_HEAD | HEAD指针的前一个状态 |
| packed-refs | 当更新一个引用时,git不会packed-refs,而是会在refs/heads下写入一个新文件。当查找一个引用时,git首先在refs目录下查找,如果未找到则到packed-refs文件中去查找。 |
2、把HEAD文件中的指针修改为ref: refs/heads/pre, 断电时停留在的分支
3、把ORIG_HEAD文件中的指针修改为ref: refs/heads/xxx, 从哪个分支切到pre就用哪个
完成2、3步骤你会发现项目所有文件都需要重新提交,这是因为你的“pre和xxx”分支损坏了
4、进入.git\refs\heads文件夹,你会看到“pre和xxx”两个损坏分支没有hash值
5、进入.git\logs\refs\heads文件夹,复制对应损坏分支的最新hash复制到.git\refs\heads文件夹下文件中
注意复制第二个
hash值,完成4、5步骤这时git已经可以“正常使用”了,本以为可以愉快的写代码了,不料竟无法提交代码到远程仓库
6、排查后发现.git\refs\remotes\origin文件夹下的分支也损坏了,到.git\logs\refs\remotes\origin文件夹里面复制对应损坏分支的最新hash,至此git终于可以正常使用了