Redmine 「專案儲存機制」無法更新問題 修復步驟

Redmine 專案可以使用 GUI 的方式來查看 Git Repository 的 Commit / 歷史紀錄 等等資訊,但是在某個日期後,就一直無法更新,手動執行下述強制更新命令也沒用。

環境:Debian / Ubuntu Linux

  1. $ cd /usr/share/redmine
  2. $ sudo bin/rails runner "Repository.fetch_changesets" -e production
  3. 出現下述 Bad object (Git 一些錯誤)
    fatal: bad object xxxaabbcc...

要怎麼處理呢?

Redmine 「專案儲存機制」無法更新問題 修復步驟

要解決的方式有幾個步驟可以嘗試看看,在這邊先從最簡單開始。

嘗試 Git fsck

  1. cd /var/cache/repositories/project.git
  2. git fsck --full # 先修正看看
  3. git gc # 順便清掉一些垃圾
  4. 再去 redmine 試試看,不行再來下面的步驟

找出有問題的 Project repositories

  1. $ cd /usr/share/redmine
  2. $ sudo bin/rails runner "Repository.fetch_changesets" -e production
  3. 出現下述 Bad object (Git 一些錯誤)
    fatal: bad object xxxaabbcc...
  4. 註:強制更新方式,除了上述 CLI 外,GUI 也有界面可以嘗試下述:
    1. Redmine 設定 -> 儲存機制清單
    2. https://redmine.example.url/sys/fetch_changesets?key=xxx # 全部 Project 都嘗試更新
    3. 指定某個專案強制更新方式:https://redmine.example.url/sys/fetch_changesets?id=<project identifier>&key=<your service key>
    4. 註:key 要怎麼產生:網站管理 → 設定 → 儲存機制清單 → 啟用管理儲存機制的網頁服務 (Web Service) → 下面有 API key

這些 bad object xxxaabbcc 要找出是哪個 Project 的,然後去修正那些問題,再來最後重建 Redmine Repository Path。

Redmine 「專案儲存機制」修復步驟

  1. $ mysql -u root -p redmine
  2. mysql> select * from repositories where extra_info like '%xxxaabbcc...%' \G # 可以找到專案名稱 (url、root_url 欄位都可以看到專案位置)
  3. $ cd /var/cache/repositories/project.git # 到各個有問題的專案分別做下面的事情
  4. $ git fsck --full # 若出現下述 dangling commit 沒關係,先不理他
    • dangling commit 44a60960589665982eb85...
    • dangling commit f6ab81e475c0aa76ffa3a...
    • dangling commit c09c86a1c073152a6bafd...
  5. $ git gc # 順便清掉一些垃圾
  6. 進入 Redmine → 設定 → 儲存機制清單 → 刪除再重新新增 → 點選儲存機制 (整個重新匯入)
  7. 這樣子就解決了

修復 dangling commit 的問題

至於 dangling commit xxx 要怎麼解決?(這個不解決也沒關係)

這個發生的原因可參考此篇:Git - 維護及資料復原 (搜尋 "dangling commit"),看起來主因在於 Branch 有建立、Commit,但是沒有 merge 回 master 直接刪除,所以沒有任何參照的情況。

  • $ git show xxx # 可以查看這個 commit 當初是做什麼事情

要清掉 dangling commit 可以參考此篇:HOWTO remove all dangling commits from your git repository

  1. $ git fsck --full
      • dangling commit 44a60960589665982eb85...
      • dangling commit f6ab81e475c0aa76ffa3a...
    • dangling commit c09c86a1c073152a6bafd...
  2. $ git reflog expire --expire=now --all
  3. $ git gc --prune=now
  4. 註:我只有使用 git gc --prune=now 就清乾淨了
  5. $ git fsck --full # 再次確認看看輕乾淨沒

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料