close

向來都做得很順利的 hg pull,昨天在 TortoiseHg 一直出現 error code 255,做到一半就中斷,會出現「cmdserver: 程序意外結束,代碼 255」。如果看詳細的錯誤訊息,裡面還有個錯誤是 "zstd.ZstdError: zstd decompressor error: Corrupted block detected"。

看不懂發生什麼事、也不知道要怎麼處理,本來想說沒辦法直接透過網路做 hg pull,想要叫對方包成包裹 (bundles) 寄給我,但在對方執行 hg bundle 時,她電腦上會出現另一款錯誤訊息:「abort: empty or missing file data for '某個檔案路徑.docx'」。

在對方電腦上切到工作目錄執行以下指令:

hg verify

出現以下錯誤:

檢查changeset中...
檢查清單中...
在 changesets 和 manifests裡交叉檢查
檢查檔案中...

 {某個檔案路徑}@{版本數字代碼}: manifest refers to unknown revision {版本的絕對編號,非數字代碼}
 warning: revlog 'data/ {某個檔案路徑}.i' not in fncache!
{版本數字代碼}: 空白的或遺失  {某個檔案路徑}
 {某個檔案路徑}@{版本數字代碼}: manifest refers to unknown revision {版本的絕對編號}
checked 223 changesets with 1028 changes to 720 files
遇到了 1 個警告

hint: run "hg debugrebuildfncache" to recover from corrupt fncache
遇到了 3 個完整性錯誤
(第一個危險的changeset 出現在
{版本數字代碼})

 

 

但依照 hg 的建議,第一次執行了 hg debugrebuildfncache 之後顯示:

正在刪除 data/ {某個檔案路徑}.i
0 items added, 1 removed from fncache

第二次之後都顯示:

fncache already up to date

但依然無法正確執行 hg pull。

查了一下看到 "Mercurial/TortoiseHG - empty or missing revlog for Thumbs.db" 這篇,最佳解答建議的做法是:

  1. 刪除會導致錯誤的檔案,選擇忘記 (forget) 該檔案,把它 commit。
  2. 再把導致錯誤的檔案加回來,把它 commit。

奇妙的是這麼做之後再執行 hg verify,還是會出現上述的「遇到 3 個完整性錯誤」之類的訊息,但是就可以做 hg pull 了耶。

--

(2022/12/08 update) 今天發生另一個狀況,中文版的 TortoiseHg 錯誤訊息是顯示路徑與流水號後,最後寫「沒有節點」。該檔案如果要嘗試在 commit 視窗裡選用 diff 工具觀看檔案差異,會導致 TortoiseHg 視窗整個當掉。

因為中文版的錯誤訊息沒有資源可以查詢,改用英文關鍵字 "no node" 查到 "LookupError: No Node" 這篇,裡面提到幾個建議:

  • 執行 hg verify(或在 TortoiseHg 工具裡選 TortoiseHg Workbench → Repository → Verify),確認 Repository 是否有損壞。
  • 直接重新 clone 一次 repository。
  • 如果沒有備分可以拿來重建 Repository,可以參考 "Dealing with Repository and Dirstate Corruption"

執行第一步時,沒有辦法解決 verify 裡找到的問題,回頭看到本文在 hg pull 遇到問題的狀況,嘗試把檔案 forget 後 commit、再重新 add 進 repository,就解決問題了。

不過真疑惑,為什麼有的人會特別容易在 commit 檔案時遇到 repo 損毀的狀況?

arrow
arrow
    創作者介紹
    創作者 小攻城師 的頭像
    小攻城師

    小攻城師的戰場筆記

    小攻城師 發表在 痞客邦 留言(0) 人氣()