macOS 中 Cornerstone 的"Clean"操作和終端的"svn cleanup"命令無效了怎麼辦?

說明:下文中的
“工作拷貝” 即 “Working Copy”,
“倉庫” 即 “Repository”,
“清理” 即 “Clean” 或 “Cleanup”

一、出現問題的場景描述

  1. 一次在無線網絡條件不佳的環境中辦公。
  2. 大約是我向“工作拷貝A”提交一些資源的操作尚未結束,又對同一倉庫中的“工作拷貝B”進行了更新操作。
  3. “工作拷貝B”的更新遲遲不能完成,卡在了某個進度。
  4. 我決定強制重啓 Cornerstone,然後重新更新“工作拷貝B”。
  5. 強制退出時,Cornerstone 給了我一段提示:

Canceling Activities...
Cornerstone is waiting for background activities to end.
Network issues might be causing activities to temporarily block while waiting for a response from the server.

大致意思是:

正在取消進程……
Cornerstone 正在等待後臺進程結束。
網絡問題可能造成進程臨時阻塞,直到服務器出現響應。

我點擊了“Quit Now”(“立即退出”),如下圖:

 

screenshot-cornerstone-quit-now.png

  1. Cornerstone 進一步給了我一個警告:

Quitting without waiting for activities to complete may result in data loss and is not recommended.
Are you sure you want to quit?

大致意思是:

未等待進程結束的退出操作可能導致數據丟失,不建議這麼做。
您確定要退出嗎?

我點擊了“Quit Anyway”(“確定退出”),如下圖:

screenshot-cornerstone-quit-anyway.png

  1. 重新打開 Cornerstone 後,發現無法對“工作拷貝B”使用常用功能了,“更新”、“提交”、“解決衝突”等都不行了,連“清理”功能都禁用了,大約僅剩下“在訪達中打開”和“刪除”功能了。

二、嘗試一些修復方法

說明:如果您只關心最終的解決方法,那麼此小節對您無關緊要,請直接前往第三小節查看。

我曾在 Windows 操作系統中遇到過 SVN 被鎖(locked)的情況,當時同事告訴我只要安裝了 TortoiseSVN 軟件,就能在工作拷貝的文件夾上右擊,然後使用 “Clean up...” 功能清理後就沒問題了;也告訴我常見的 SVN 被鎖的問題,基本都可以用 “Clean up...” 方法解決。

不幸的是 Cornerstone 已經不允許我使用“清理”功能了,我想也許 mac 終端鍵入 svn “清理”命令的方式還能用,就決定試試。

我打開 mac 終端,切換到“工作拷貝B”的根目錄下,鍵入瞭如下命令並執行:

 

svn cleanup

mac 終端給了我一些錯誤:

 

svn: E155037: Cleanup with an older 1.7 client before upgrading with this client
svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted

大致意思是:

 

svn: E155037: 在升級客戶端之前,使用早期 1.7 版本的客戶端進行了清理操作
svn: E155037: 之前的操作尚未結束;如果之前的操作是意外中斷,運行 'cleanup' 命令

看來使用 mac 終端執行 svn “清理”命令的方式也無效了。

當然還有一種粗暴的方式可以解決我的問題,那就是刪除“工作拷貝B”,重新從倉庫中拉取資源。

如果只針對我的“工作拷貝B”來說,這並不麻煩。工作拷貝中只是些項目上的文檔,我基本也不會修改這些文檔,只是查閱使用。

可是假如我以後又碰到了這個場景,且出現問題的是我頻繁操作的用來存放代碼的工作拷貝,那就比較麻煩了。我要把本地未提交的代碼先做好備份,再從倉庫重新拉取代碼,然後把我未提交的代碼放到新的工作拷貝中,想想就覺得麻煩。又或者這個工作拷貝資源量很多,重新拉取肯定很耗費時間。

抱着“怕麻煩”的心理,我開始在網絡上查找類似的問題,終於發現了下面這個修復思路。👇

如果您的電腦可以顯示隱藏文件夾和文件,您會發現工作拷貝的根目錄下有一個 .svn 文件夾,裏面有一個 wc.db 文件,如下圖:

 

screenshot-svn-database-file.png

大約是這個文件記錄了您的 SVN 操作,一些情況下(例如:強制退出 Cornerstone)會導致文件尚未記錄完成,所以 SVN 決定上個鎖,禁止您對這個工作拷貝的後續操作,其中也包括禁止您使用“清理”功能。

如果我能修改這個 wc.db 文件,刪除那些未完成的記錄,應該就能正常操作我的“工作拷貝B”了。

想要修改 wc.db 文件,您需要一個 SQLite 軟件。如果您使用 macOS,那麼系統本身已經幫您預安裝了,可直接使用;如果您使用 Windows 操作系統,那麼需要先下載適合您系統的安裝包,然後安裝此軟件,官方下載地址是:https://www.sqlite.org/download.html

三、解決方法

  1. 假設您出問題的工作拷貝路徑是:/Users/xiaoming/work/working-copy,打開 mac 終端,鍵入下面的命令並執行,進入此工作拷貝的根目錄:

 

cd /Users/xiaoming/work/working-copy
  1. 鍵入下面的命令並執行,查找未完成的記錄:

 

sqlite3 .svn/wc.db "select * from work_queue"

例如查找到的記錄如下:

 

88|(file-install 63 path/to/fileA.rp 1 0 1 1)
89|(file-install 64 path/to/fileB.rp 1 0 1 1)

可以看出在此工作拷貝中,對“文件A”和“文件B”的操作尚未完成。

  1. 鍵入下面的命令並執行,刪除未完成的記錄:

 

sqlite3 .svn/wc.db "delete from work_queue"

如果一切順利,mac 終端什麼都不會輸出,心安理得。


如果您使用 Windows 操作系統,解決方法與上述 macOS 的基本相同。在安裝了 SQLite 軟件後,只需要先通過 cmd 命令行工具切換到出問題的工作拷貝路徑,然後依次鍵入並執行下面的命令即可:

 

sqlite3.exe .svn/wc.db "select * from work_queue"
sqlite3.exe .svn/wc.db "delete from work_queue"

說明:暫未驗證 Windows 操作系統下上述方法是否有效,如果您驗證有效,請告訴我。

四、問題已經解決了

此時回到 Cornerstone ,已經允許您對工作拷貝執行“更新”、“提交”、“解決衝突”、“清理”等操作了。

然而,如果您此時直接對工作拷貝執行“更新”等操作,Cornerstone 會提醒您當前工作拷貝仍然處於鎖定的狀態,所以記得先“清理”一下工作拷貝。

這個解決方法比從倉庫中重新拉取資源好得多了,不是嗎?

原文:https://www.jianshu.com/p/b7faf41d89a3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章