记录一次因服务器关机造成的Git服务异常

环境:Ubuntu 16.04 、Git 2.7.4

事情原因:之前公司使用的是SVN版本控制器,后来,因为分支的需求,所以搭建了Git;

今天早上因为Git服务器上tomcat服务出现异常,需要手动重启服务器;所以,同事手动重启了服务器;但是恰巧刚好另一个同事,正在push一个本地分支到Git服务器上;所以造成该同事本地仓库出现错乱;(当时 我并不知道这件事。是后面其它同事提交Git时发现push失败,出现异常);

假如,当前push错误的分支为C

其它分支有A、B

当使用git pull A 或者 git push A 或者 git pull B/git push B 到Git服务器;都不会报错

但是,push / pull C分支,或者是使用git fetch时,就出现异常

异常错误:

$ git fetch
[email protected]'s password:
error: object file ./objects/70/44716e362b4dfe9133728147c3cc27e8d15dd1 is empty
error: object file ./objects/70/44716e362b4dfe9133728147c3cc27e8d15dd1 is empty
fatal: loose object 7044716e362b4dfe9133728147c3cc27e8d15dd1 (stored in ./objects/70/44716e362b4dfe9133728147c3cc27e8d15dd1) is corrupt
fatal: The remote end hung up unexpectedly

注意:fatal: loose object... 这里的意思就是说7044...这个版本号在447...当中不存在,447...的记录为空;我猜想447当中记录的是该分支(C分支)的上一个版本号;

验证:

扫描二维码关注公众号,回复: 4515429 查看本文章

登录到Git服务器后台,进入项目的仓库中(比如example.git);进入该目录下的refs/heads/ 

目录下有一个当前分支的文件(C);使用cat 查看一下,终端输出的内容就是447...;

到这里,问题已经很清晰了。就是因为在push时,服务器断电,造成版本丢失,所以分支C不能使用;而使用fetch命名是拉取远程上所有的分支,该分支包含出错的C分支,所以fetch失败;而其它分支不受印象;

解决方法:

1.删除远程分支

1)删除 Git服务器上项目仓库下/objects/70/44716e362b4dfe9133728147c3cc27e8d15dd1文件,

2)删除项目仓库下/refs/heads/分支名称 文件

3)直接在本地仓库使用git 命令删除远程分支(我这里删除远程分支出错了,如果出错参考1)

这两种方法都可以;但是操作之前一定要备份服务器上项目仓库:cp -a excample.git example.git-bak

2.重建本地项目(仓库):如果出现loose object 一定要重建,不能使用以前的本地仓库(push C分支的同事的电脑上要重建项目仓库)

3.push  / pull  / fetch  使用各种Git命令对本地仓库和远程仓库检测;问题解决

注意:重点是删除远程分支,重建本地分支,如果不重建项目的话,还是在原来的本地仓库添加远程分支(没有修改过),创建没有问题,但是如果再修改内容后再push的话,push也能成功,fetch也能成功(C分支的同事的机器上), 但是在其它同事电脑上还是不能fetch;会报另外一个错误

19:35:31 Fetch failed
         remote: error: object file ./objects/0e/3255209641d780b165aa1628dde1200851e9de is empty        
         remote: error: object file ./objects/0e/3255209641d780b165aa1628dde1200851e9de is empty        
         error: git upload-pack: git-pack-objects died with error.
         fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
         fatal: protocol error: bad pack header

如果出现这种错误,说明你的本地仓库已经出现非常致命的问题了,不是简单修修改改就能行,我尝试过,去删除,修改一些文件,结果问题越来越多;才发觉已经走歪了,所以赶紧走回来;果断备份本地项目,再次删除远程分支(因为刚刚在原来的仓库新建立的远程分支),重建本地项目仓库,添加新分支,push到远程仓库;以及修改内容,push到远程分支后,其他同事fetch;没有问题,至此问题已经解决

再次重申一下,问题主要是因为本地仓库版本号丢失以及版本号错乱了;所以,导致分支不能使用;删除分支,重建本地项目仓库;

至于备份本地仓库,因为改远程分支上已经有很多可用的代码,重建本地项目仓库后,添加新的分支后,切换到该分支后,直接将备份的项目的代码覆盖,然后提交/push即可(不可能再去重新敲一次代码:所以备份是一个好习惯)

猜你喜欢

转载自blog.csdn.net/qq_33571718/article/details/81291575