背景
在svn使用过程中,有时候会出现默认奇妙锁死的情况。有时候可能在svn执行过程中强制退出等导致。此时,如果输入svn st,查询状态,出现下面场景。

第一步
不考虑人为进行lock情况,这种其实是正常的上锁。
-
清理本地状态:
尝试运行 cleanup 命令来修复本地的工作副本状态:
svn cleanup注:TortoiseSVN 用户可以在文件夹上右键 -> TortoiseSVN -> Clean up。
-
重新更新:
清理后,尝试更新一下代码,同步服务器状态:
svn update
如果执行第一步没有恢复正常,并且还是lock状态,比如出现下面的打印。
svn: E200033: database is locked, executing statement 'RELEASE s0'
那么直接进行下面的操作。
第二步
确认是否下SVN占用导致,一般情况下,在svn操作过程中异常退出,大概率SVN进程没有退出。执行 ps 的目的通常是检查是否有残留的 SVN 进程在占用数据库。
# 查找进程
ps -ef | grep svn
# 杀掉进程 (将 <PID> 替换为实际的进程 ID)
kill -9 <PID>
# 如果是 IDE 卡住,可能需要关闭 IDE 进程
kill -9 <IDE_Process_ID>
#检查svn状态
svn status
- 后续 :进程杀掉后,再次执行
svn cleanup通常就能成功了。
如果还是异常不能恢复,或者没有SVN进程残留,那么继续往下排查和操作。
第三步
SVN 的本地状态信息存储在项目根目录下 .svn 隐藏文件夹中的 wc.db 数据库里。我们需要手动清理里面的锁表。如果你不想安装可视化工具,可以通过命令行来备份数据库并重建,以消除锁状态。
步骤:
-
进入项目的 .svn 目录 :
cd /your/project/path/.svn -
备份原数据库 :
mv wc.db wc.db.old -
导出并重建数据库 (此操作会去除损坏的锁状态):
sqlite3 wc.db.old进入 sqlite3 交互模式后,依次输入以下命令:
.backup main wc.db .exit(注:如果提示找不到
.backup命令,说明你的 sqlite3 版本过旧,请使用方法一。) -
重新 Cleanup :
cd /your/project/path svn cleanup