说明:下文中的
“工作拷贝” 即 “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”(“立即退出”),如下图:
- 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”(“确定退出”),如下图:
- 重新打开 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 文件,如下图:
大约是这个文件记录了您的 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 会提醒您当前工作拷贝仍然处于锁定的状态,所以记得先“清理”一下工作拷贝。
这个解决方法比从仓库中重新拉取资源好得多了,不是吗?