
GitLab 是 Git 程式版本控管系統的優質方案,功能強大、介面美觀。
但是自己建置與維護,難免會遇到一些疑難雜症,例如 Project Repository 損毀。
問題狀況
這個問題其實有陣子了,開發人員在 git 提交上 GitLab Server 時,有時候傳到一半這台 GitLab Server 會死當,要強制關機 (Stop) 或重開 (Restart) 才能恢復。
開起來後看似完好,但登入 GitLab 點進去當機時正在提交的 Project Repository,該 Project 就顯示損毀,無法開啟。

這可麻煩了,請同事以指令嘗試,也出現這樣的錯誤:
測試 git 指令
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch --prune origin
error: object file ./objects/e6/ec31eecfdfa61e0a4939f0c360f961204e75ff is empty
error: object file ./objects/e6/ec31eecfdfa61e0a4939f0c360f961204e75ff is empty
Completed successfully.
進行排除
從訊息看起來可能是檔案寫入失敗所以成為空檔,從稍早前的整機備份檔去挖這個路徑...沒這個檔案,排除此可能性。
會造成影響的檔案主要在這個路徑底下:
/var/opt/gitlab/git-data/repositories/<namespace>/<reponame>.git/objects
網路上發現也有許多人遇到類似的狀況,其中一篇是我認為可行的方案,作法如下。
切換至損毀 repository 資料夾
# cd gitlab/repositories/<namespace>/<reponame>.git
執行 git 修復指令
# git fsck
刪除無效空白檔案
# find . –size 0 –delete
再執行一次 git 修復指令
# git fsck
到這以後,可以先試試 Web 介面是否可以登入 GitLab 去開啟這個 Project Repository,或是以 git 指令 push 或 fetch 看看。
在我的情況是仍然未修復,以指令操作後出現這樣的錯誤:
測試 git 指令結果
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch origin develop:develop
error: refs/heads/develop does not point to a valid object!
fatal: Couldn't find remote ref develop
fatal: The remote end hung up unexpectedly
Completed with errors, see above.
好了,看起來指的是 develop 這個分支有問題,繼續做下一步。
移除 develop 分支對照檔
# mv ./refs/heads/develop ~/
再執行一次 git 修復指令
# git fsck
接下來可以再到 Web 上登入 GitLab,進入這個 Project Repository。

確認可以正常開啟了,不過因最新的 develop 分支有問題而刪除,所以需要從開發機再次 commit 一次上來即可。
結論
GitLab 很棒,不過常常比較大量提交寫檔時會死掉這件事挺困擾的,當服務重新啟動時的自我檢測與恢復機制又做的不夠完善,導致管理者要較多手工來修復,相信未來的 GitLab 能夠加強這部份的機制。
至於 GitLab 伺服器這端,會先做存取效能改善,擴充儲存設備的高速讀寫能力來減少這樣的情況發生。
參考資料
- git - Gitlab repository error failed to find pack entry - Stack Overflow
https://stackoverflow.com/questions/36546774/gitlab-repository-error-failed-to-find-pack-entry - Git - git Documentation
https://git-scm.com/docs/git - find(1) - Linux man page
https://linux.die.net/man/1/find

