向來都做得很順利的 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" 這篇,最佳解答建議的做法是:
- 刪除會導致錯誤的檔案,選擇忘記 (forget) 該檔案,把它 commit。
- 再把導致錯誤的檔案加回來,把它 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 損毀的狀況?
留言列表