git reference broken 記一次斷電引發的git翻車事件,我丟失了stable分支

deliangyang發表於2018-06-22

背景

有些配置需要更新上線,程式碼在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. my.oschina.net/Tyrfing/blo…

相關文章