用 Visual Studio 做 Git Rebase、Merge,操作到一半個人電腦忽因不明原因斷電(不是重開機,是電源自己關閉,疑似硬體問題格外讓人發毛,但會是另一個故事),重開機進入系統,除登入 Windows 時間稍久,其他看來還好。 等重新打開 Visual Studio 才發現不妙,斷電前處理的專案顯示為未設定版控,使用 Cmder 開啟專案目錄,出現 cmder\vendor/clink.lua:182: attempt to index local 'HEAD' (a nil value) 錯誤訊息,執行 git 指令則得到 fatal: not a git repository (or any of the parent directories): .git 訊息,推測剛才的斷電意外導致 Git 寫入磁碟動作中斷,有檔案毁損了!!

第一個動作是先備份整個 Git Repository 目錄(尤其是 .git 資料夾),先完整保留現場,才能放膽嘗試修復,不怕失手搞丟檔案。

由 attempt to index local 'HEAD' (a nil value) 線索找到 .git/HEAD,發現其內容變成一堆 ASCII \0 (NUL):

回憶斷電前所在分支位置,將 HEAD 內容改為 ref: refs/heads/branch-name 之後 Cmder 可正確顯示分支,但 git 指令彈出錯誤:

error: bad signature 0x00000000
fatal: index file corrupt

使用 VSCode Git Graph 檢視也出現相同錯誤,線圖無法顯示:

使用 Git 以來第一次遇到這種狀況,讓我格外驚慌,很擔心資料錯亂無法修復。所幸,爬文很快找到網友分享類似經驗,一樣也是意外斷電造成(是被同事關掉電源!),而修復方法出奇簡單,將 .git/index 刪除,再執行 git reset (相當於 git reset --mode mixed HEAD) 或 git read-tree 就好了。

就醬,看似失去呼吸心跳的 Git 儲存庫又復活了! 我壓抑自己不要在辦公室站起來高喊哈里路亞,但,Git 真的好威呀~

歷經這場驚魂,我有一些心得:

  1. 系統強韌與否與諸多設計細節有關,像是簡化資料結構不易出錯、索引或快取資料要能隨時重建、降低系統各環節相依性、確保工具程式在災難現場還能執行... 等,能避免系統因為一丁點問題崩潰,即便出錯也容易修復。具備同樣功能的兩支程式,可能強韌如牛皮,也可能脆弱如玻璃,問市 15 年的 Git 歷經千錘百鍊,可靠度與強韌性不容懷疑,這次表現也讓我很滿意。
  2. 主流工具的技術資源特別豐富,像是這次我就很快找到斷電修復案例,還是中文文章,省去大量摸索時間,西瓜還是要偎大邊啊~
  3. Git 出狀況的 SOP:先完整複製資料夾保留現場,再進行檢修,如此即使改壞了,還原整個資料夾即可取消動作不會有任何損失。能沒有心理負擔勇敢嘗試,才有助於技術人員學習成長。
  4. 學 Git 還是該會指令,並要搞懂原理,只會 GUI 工具,一旦遇上疑難雜症,沒人能救你。

My Git repository is corrupted after a power break accident, here is my experience to fix it.


Comments

Be the first to post a comment

Post a comment