說明:下文中的
“工作拷貝” 即 “Working Copy”,
“倉庫” 即 “Repository”,
“清理” 即 “Clean” 或 “Cleanup”
一、出現問題的場景描述
- 一次在無線網絡條件不佳的環境中辦公。
- 大約是我向“工作拷貝A”提交一些資源的操作尚未結束,又對同一倉庫中的“工作拷貝B”進行了更新操作。
- “工作拷貝B”的更新遲遲不能完成,卡在了某個進度。
- 我決定強制重啓 Cornerstone,然後重新更新“工作拷貝B”。
- 強制退出時,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
- 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
- 重新打開 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
三、解決方法
- 假設您出問題的工作拷貝路徑是:
/Users/xiaoming/work/working-copy
,打開 mac 終端,鍵入下面的命令並執行,進入此工作拷貝的根目錄:
cd /Users/xiaoming/work/working-copy
- 鍵入下面的命令並執行,查找未完成的記錄:
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”的操作尚未完成。
- 鍵入下面的命令並執行,刪除未完成的記錄:
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 會提醒您當前工作拷貝仍然處於鎖定的狀態,所以記得先“清理”一下工作拷貝。
這個解決方法比從倉庫中重新拉取資源好得多了,不是嗎?