git reference broken 记一次断电引发的git翻车事件,我丢失了stable分支

背景

有些配置需要更新上线,代码在new-dev, 然后在stable分支上面cherry-pick new-dev分支上的commit id 然后 git push代码到服务器上面,此时正好停电了。过了不久,恢复供电。 此时执行命令git status

fatal: Not a git repository (or any of the parent directories): .git

什么,不是git仓库,通常想到的就是.git文件找不到,不可能啊

ls -la .git
total 1237
drwxr-xr-x 1 Administrator 197121       0 Jun 22 15:28 .
drwxr-xr-x 1 Administrator 197121       0 Jun 22 15:28 ..
-rw-r--r-- 1 Administrator 197121      45 Jun 22 15:28 COMMIT_EDITMSG
-rw-r--r-- 1 Administrator 197121    1416 Jun 22 15:28 FETCH_HEAD
-rw-r--r-- 1 Administrator 197121      23 Jun 22 15:28 HEAD
-rw-r--r-- 1 Administrator 197121      41 Jun 22 15:28 ORIG_HEAD
-rw-r--r-- 1 Administrator 197121     580 Jun 11 17:12 config
-rw-r--r-- 1 Administrator 197121      73 Jun  4 18:04 description
drwxr-xr-x 1 Administrator 197121       0 Jun  4 18:04 hooks
-rw-r--r-- 1 Administrator 197121 1220081 Jun 22 15:28 index
drwxr-xr-x 1 Administrator 197121       0 Jun  4 18:04 info
drwxr-xr-x 1 Administrator 197121       0 Jun  4 18:04 logs
drwxr-xr-x 1 Administrator 197121       0 Jun 22 15:28 objects
-rw-r--r-- 1 Administrator 197121    7708 Jun  4 18:04 packed-refs
drwxr-xr-x 1 Administrator 197121       0 Jun 22 16:26 refs

于是偷个懒,懒得修复了,直接git clone一个新的项目,然后发现stable分支已经找不到了。这下我就慌了,还好昨天有人修改上线, 之后也没有人修改代码,有最新的tag。按照如下操作,发现代码提交不上去,于是搜索了一下reference broken[1],说是服务器文件有损坏, refs/heads/statble中的commit id为空或者乱码。

于是找来运维大哥上gitlab服务器上面看看,果然,resf/heads/stable中的commit id,为空,然后我到本地的同级目录下看看这个文件 里的字节全是0。从tag把最新的commit id写入这个文件,然后stable分支就出现了。

root@ubuntu:/mnt/api-xxx# git checkout xxx-release-5.0.4.201806211050
root@ubuntu:/mnt/api-xxx# git checkout -b stable
root@ubuntu:/mnt/api-xxx# git push --set-upstream origin stable
Total 0 (delta 0), reused 0 (delta 0)
remote: error: cannot lock ref 'refs/heads/stable': unable to resolve reference 'refs/heads/stable': reference broken
To gitlab.xxx.tv:xxx/api.git
 ! [remote rejected]     stable -> stable (failed to update ref)
error: failed to push some refs to 'git@gitlab.xxx.tv:xxx/api.git'

总结

定时备份数据(不局限在这个项目上面,这个有tag),断电这种不可抵抗力因素,如果遇到了,可能一下午还要加班在填坑

到最后我我还在yy,是我push这个commit导致gitlab负载过高,然后断电了

参考

  1. https://my.oschina.net/Tyrfing/blog/1612487

0 comments

To reply to the article, please Login or registered