svn cleanup 的核心作用
svn cleanup 命令会递归地清理指定路径(默认为当前目录)下的工作副本,移除所有由 SVN 操作(如 update, commit, switch 等)创建的工作文件和锁。

当你执行一个 SVN 操作时(svn update),SVN 会在你的工作副本中创建一些临时文件或锁定文件,以确保操作的原子性和一致性,如果这个过程被意外中断(比如你按了 Ctrl+C、电脑死机、网络断开等),这些临时文件和锁就会残留下来。
这些残留物会导致后续的 SVN 操作失败,最常见的错误就是:
working copy locked(工作副本被锁定)Entry is out of date(条目已过时)- 或者其他一些看似莫名其妙、无法执行的 SVN 命令。
svn cleanup 就是你解决问题的“万能钥匙”。
主要解决的问题场景
当你遇到以下情况时,首先应该想到 svn cleanup:

-
操作被意外中断:
- 正在
svn update或svn commit时,手动按Ctrl+C强制终止。 - 电脑突然断电或死机。
- 网络连接中断,导致 SVN 操作卡住。
- SVN 进程崩溃。
- 正在
-
出现“工作副本被锁定”错误:
- 当你尝试执行
svn update,svn commit,svn add等命令时,SVN 提示:svn: E155036: Please execute the 'cleanup' command in '/path/to/your/working/copy' first.或者更常见的:
svn: E155010: Working copy '/path/to/your/working/copy' locked - 这个错误明确告诉你,某个操作没有正常完成,工作副本处于一个“脏”的锁定状态,需要清理。
- 当你尝试执行
-
清理
.svn目录中的临时文件:
(图片来源网络,侵删)- SVN 会在每个工作副本的隐藏目录
.svn中存放一些临时数据(如tmp目录下的文件)和锁信息(如lock文件)。svn cleanup会安全地删除这些不再需要的文件。
- SVN 会在每个工作副本的隐藏目录
如何使用 svn cleanup
基本用法
在你遇到 SVN 操作问题时,首先切换到你的 SVN 工作副本目录,然后执行:
svn cleanup
这会清理当前目录及其所有子目录(递归清理)。
指定路径清理
如果你想清理另一个工作副本,可以直接指定其路径:
svn cleanup /path/to/another/working/copy
强制清理 ( --force 或 -f )
这是 svn cleanup 最强大的一个选项,工作副本的锁定信息可能已经损坏或与服务器状态不一致,导致普通的 svn cleanup 无法成功,这时可以使用强制清理。
警告:强制清理会无条件地删除所有锁和临时文件,即使它们可能对应着一个仍在服务器上运行但中断的提交操作,这可能会导致数据丢失或不一致,请谨慎使用,仅在普通清理无效时再尝试。
# 强制清理当前目录 svn cleanup --force # 或者使用短选项 -f svn cleanup -f
命令选项详解
| 选项 (长/短) | 描述 |
|---|---|
--force (-f) |
强制清理,无条件地删除工作副本中的所有锁定和临时文件,即使它们可能对应着一个远程仍在进行的操作。使用此选项有风险,可能导致数据丢失。 |
--remove-unversioned (-u) |
删除未版本控制的文件,在清理的同时,删除工作副本中所有未被 SVN 追踪的文件和目录。这是一个破坏性操作,请务必谨慎! |
--remove-ignored (-g) |
删除被忽略的文件,在清理的同时,删除所有被 svn:ignore 属性标记的文件和目录,同样具有破坏性。 |
--include-externals (-E) |
包含外部项目,在清理主工作副本的同时,也清理所有通过 svn:externals 属性引入的外部工作副本。 |
--depth |
指定清理的深度。svn cleanup --depth immediates 只清理当前目录,不递归到子目录。 |
实际操作流程示例
假设你正在提交一个大的代码改动,但提交到一半网络断了,之后你发现所有 SVN 命令都报错。
-
发现问题:
$ svn commit -m "big feature" # ... 提交过程 ... # 突然网络断开,命令卡住或中断 $ svn status svn: E155010: Working copy '.' locked
你看到
working copy locked错误。 -
尝试解决:
-
第一步:执行
svn cleanup$ svn cleanup
如果这个命令成功输出
Cleaned up '...',那么问题通常就解决了,你可以再次尝试svn commit。 -
第二步:如果第一步失败,尝试
svn cleanup --force$ svn cleanup --force
如果这次成功了,说明锁信息已损坏,强制清理解决了问题。注意:理论上,这可能导致你提交的部分代码丢失,但在大多数情况下,这只是个警告,实际影响不大。
-
第三步:清理后检查状态
$ svn status
svn status没有输出,或者输出的内容都是你预期的(比如新添加的文件 ),说明清理成功,如果还有 (缺失) 或C(冲突) 标记,则需要针对具体问题进行解决。
-
与 svn update --accept theirs-full 的区别
你可能会遇到 svn update 后出现冲突(C 状态),SVN 会提示你解决冲突后运行 svn resolved。
svn cleanup: 解决的是操作中断导致的锁问题,它不关心文件内容是否冲突,它只是移除 SVN 内部的“路障”。svn resolved: 解决的是内容冲突问题,当你手动解决了冲突文件后,需要运行svn resolved来告诉 SVN “这个文件我已经处理好了,请移除它的冲突状态”。
两者解决的是不同层面的问题,但都可能在 svn update 后被需要。
| 命令 | 作用 | 何时使用 |
|---|---|---|
svn cleanup |
清理因操作中断而残留的锁和临时文件。 | 当 SVN 提示 working copy locked 或操作被意外中断后,任何 SVN 命令都无法执行时。 |
svn cleanup --force |
强制删除所有锁和临时文件,无视潜在风险。 | 当普通 svn cleanup 失败时,作为最后的手段。 |
svn resolved |
标记已解决的冲突文件。 | 当你手动处理完 svn status 中标记为 C (冲突) 的文件后。 |
svn cleanup 是 SVN 工具箱里的“瑞士军刀”,是解决工作副本“罢工”问题的首选工具,遇到问题,先 cleanup,准没错!
