菜鸟科技网

svn cleanup 命令

svn cleanup 的核心作用

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

svn cleanup 命令-图1
(图片来源网络,侵删)

当你执行一个 SVN 操作时(svn update),SVN 会在你的工作副本中创建一些临时文件或锁定文件,以确保操作的原子性和一致性,如果这个过程被意外中断(比如你按了 Ctrl+C、电脑死机、网络断开等),这些临时文件和锁就会残留下来。

这些残留物会导致后续的 SVN 操作失败,最常见的错误就是:

  • working copy locked (工作副本被锁定)
  • Entry is out of date (条目已过时)
  • 或者其他一些看似莫名其妙、无法执行的 SVN 命令。

svn cleanup 就是你解决问题的“万能钥匙”。


主要解决的问题场景

当你遇到以下情况时,首先应该想到 svn cleanup

svn cleanup 命令-图2
(图片来源网络,侵删)
  1. 操作被意外中断

    • 正在 svn updatesvn commit 时,手动按 Ctrl+C 强制终止。
    • 电脑突然断电或死机。
    • 网络连接中断,导致 SVN 操作卡住。
    • SVN 进程崩溃。
  2. 出现“工作副本被锁定”错误

    • 当你尝试执行 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
    • 这个错误明确告诉你,某个操作没有正常完成,工作副本处于一个“脏”的锁定状态,需要清理。
  3. 清理 .svn 目录中的临时文件

    svn cleanup 命令-图3
    (图片来源网络,侵删)
    • SVN 会在每个工作副本的隐藏目录 .svn 中存放一些临时数据(如 tmp 目录下的文件)和锁信息(如 lock 文件)。svn cleanup 会安全地删除这些不再需要的文件。

如何使用 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 命令都报错。

  1. 发现问题

    $ svn commit -m "big feature"
    # ... 提交过程 ...
    # 突然网络断开,命令卡住或中断
    $ svn status
    svn: E155010: Working copy '.' locked

    你看到 working copy locked 错误。

  2. 尝试解决

    • 第一步:执行 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,准没错!

分享:
扫描分享到社交APP
上一篇
下一篇