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

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