当'svn cleanup'失败时,我应该怎么办?

256

我的工作文件夹里有很多变更,但在尝试更新时出了一些问题。

现在当我执行“svn cleanup”命令时,会得到以下输出:

>svn cleanup .
svn: In directory '.'
svn: Error processing command 'modify-wcprop' in '.'
svn: 'MemPoolTests.cpp' is not under version control

MemPoolTests.cpp是另一位开发人员添加的新文件,在更新中已经下载。在我的工作目录中之前并不存在此文件。

在不必检出全新的代码库的情况下,有什么我可以尝试来继续前进吗?

澄清:谢谢有关将目录移开并下载新副本的建议。我知道这是一个选择,但我想避免这种情况,因为有许多更改嵌套在几个目录深处(这应该是一个分支……)

我希望能够以更积极的方式进行清理,可能是强制使SVN遇到问题的文件回到已知状态(我尝试删除了它的工作副本…但没有效果)。


1
回复:使用新副本。获取Beyond Compare的副本以便将版本进行比较。 - Jon Winstanley
2
阿明的解决方案对你没有起作用吗?否则肯定有一个显而易见的答案可以接受吧? - Alice Purcell
2
确保没有任何文件被应用程序打开,这很容易被忽视。使用Process Explorer和路径的快速搜索非常有用,可以揭示这一点:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx - angularsen
5
在我看来,“svn cleanup”命令的存在是一种失败的承认。 - yoyo
1
31个回答但没有一个被采纳。学习要点:经常提交。不要在没有提交的情况下进行太多复杂的更改。这不仅是因为svn可能会混淆,还因为您可能会感到困惑,并且可能希望通过回滚到以前的提交来撤消一些复杂的更改。如果您无法使用新的、新鲜的checkout继续工作,则您的工作流程是次优的。所以不要与svn对抗,而是充分利用它。 - Roland
显示剩余2条评论
31个回答

229

当重新开始不是一个选项时...

我在.svn目录中删除了日志文件(我还删除了.svn / props-base中的有问题文件),进行了清理,然后恢复了我的更新。


3
我遇到了与原问题类似的问题(由于svn检出过程中断引起)。这个方法解决了我的问题。不过我还需要返回到父目录执行同样的操作。 - Nigel Hawkins
2
+1 我不知道我有多少次遇到这种情况。如果只是子文件夹,那没问题,直接删除整个文件夹,清理并更新即可。但如果是根目录中的文件,则这不是一个便宜的选项(需要数小时才能再次检查整个项目)。绝妙的提示——非常感谢。 - Ewan Makepeace
9
对我来说,删除锁定文件就可以解决问题。这可能对其他人有用。您可以使用以下命令递归地删除它们:rm -rffind . -type f -name lock - H6.
1
happy-coding的命令不起作用,但这个可以:sudo rm -rf | find . -type f -name lock - Zachary Schuessler
3
我找不到.svn/prop-base文件夹,但我有.svn/[pristine|tmp|entries|format|wc.db]文件夹。 - 0x777
显示剩余9条评论

121

SVN 1.7有所改变,流行的在.svn目录中删除日志文件的解决方案已经不可行,因为采用了数据库工作副本实现。

以下是我做过的看起来有效的操作:

  1. 删除您的工作副本中的 .svn 目录。
  2. 在一个新的临时目录中开始一个新的检出。
  3. 取消检出(我们不想等待所有文件都被下载)。
  4. 对这个取消的检出运行清理。
  5. 现在我们有一个新的 .svn 目录和一个干净的数据库(虽然没有/很少文件)
  6. 将此 .svn 复制到您旧的、损坏的工作目录中。
  7. 运行 svn update 命令,它应该将您的新部分 .svn 目录与旧的工作目录保持同步。

从流程上来看,这有点令人困惑。本质上,我们正在删除受损的 .svn 然后为相同的检出路径创建一个新的 .svn。然后,我们将这个新的 .svn 移动到我们的旧工作目录,并将其更新到仓库。

我在 TSVN 中刚刚完成了这项工作,它似乎可以正常工作并且不需要完全检出和下载。

-Jody


8
我似乎每个月都要做至少两次这件事,真是一种痛苦。SVN团队应该添加这些步骤“svn cleanup --force”。当然,所有添加、删除和(使用1.8版本)重命名操作都将丢失。 - Martin
2
@Adgezaza 是的。它确实如此。 - mjs
1
这对我有用。它有点不同:在更改svn后,更新1个特定文件夹失败。删除该文件夹,一切正常。 - Hoàng Long
2
我重新安装了SVN(Tortoise SVN 1.8),删除了我的项目中的每个.svn文件夹,然后执行了这里提到的操作,哇!感谢作者! - Dmitry
1
只需格式化您的计算机并重新开始。另一个选项是将所有基础架构迁移到Git,这比修复您的SVN仓库需要更少的时间。 - Francesco Pasa
显示剩余4条评论

118

看一下

http://www.anujvarma.com/svn-cleanup-failedprevious-operation-has-not-finished-run-cleanup-if-it-was-interrupted/

以上链接中解决方法概要 (感谢Anuj Varma)

  1. http://www.sqlite.org/download.html下载并安装sqlite命令行工具 (sqlite-tools-win32)

  2. sqlite3 .svn/wc.db "select * from work_queue"

此SELECT会将问题文件/文件夹显示在工作队列中,需要将其从工作队列中删除。

  1. sqlite3 .svn/wc.db "delete from work_queue"

完成。现在可以再次运行清理操作 - 它应该可以正常工作了。或者,您可以直接继续之前的任务(例如添加新文件等)。


请注意,仅链接答案是不被鼓励的,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的摘要,将链接作为参考。 - kleopatra
9
Firefox有一个SQLite Manager扩展,可以打开和编辑.svn/wc.db文件。提供了一个方便的图形用户界面,用于在work_queue上执行相应操作。 - Magicianeer
如果你有最近版本的SVN和Firefox,sqlite manager插件可以在30秒内解决这个问题。不用担心删除目录或使用Repobrowser。我认为在2016年,这应该是被接受的答案。 - arbit
5
对我来说,运行“delete from WC_LOCK;”也是必须的。 - Tristan.Liu
工作完美!Svn太烂了!但是在从work_queue中删除后,svn给我另一个错误“svn locked”,只需使用tortoise运行(eclipse没有这个选项),勾选“break locks”进行清理。 - amdev

42

如果其他方法都失败了:

  1. 在一个新文件夹中检出。
  2. 复制你修改过的文件到其中。
  3. 再次检入。
  4. 在删除旧文件夹并开始使用新文件夹之前,将旧文件夹压缩到某个位置(你永远不知道+多加点谨慎是好事)。

29

最新版本(我正在使用1.9.5)通过在清理菜单中添加“打破锁定”选项来解决此问题。只需确保在进行清理时选择了此复选框。

清理窗口


现在看起来好像很明显!谢谢。 - Billy Jake O'Connor
运行得非常顺利! - Viswanath
对我来说很有效。 - Sergey
成功了!当我看到这个解决方案时,我立刻知道问题出在哪里了...(我想): 我还打开了一个修改它的Excel文件。我想提交我的更改到一些Java文件中,看到了Excel文件,就像"我没有在那里做任何更改...还原"。但是这并没有起作用,然后我意识到它仍然打开着,关闭它,按F5,它不再出现在提交中,所以继续提交。然后它告诉我"请运行清理",从那时起我就卡住了。所以谢谢! :) - BAERUS

16

本回答仅适用于 1.7 版本之前的版本(感谢 @ŁukaszBachman)。

Subversion 按文件夹(在 .svn 中)存储其信息,所以如果你只涉及子文件夹,就不需要检出整个仓库,只需检出出问题的文件夹即可:

cd dir_above_borked
mv borked_dir borked_dir.bak
svn update borked_dir

这将为您提供一个良好的工作副本,但您仍然可以在borked_dir.bak中备份更改的文件夹。对于Windows/TortoiseSVN也是同样的原理。

如果您在隔离文件夹中进行了更改,请查看

svn checkout -N borked_dir   # Non-recursive, but deprecated

svn checkout --depth=files borked_dir
# 'depth' is new territory to me, but do 'svn help checkout'

使用您的建议“如果您只处理子文件夹,则无需检出整个存储库”,节省了大量时间。 - iBabur
这对我很有效 - 我所做的只是在另一个标签页中 svn up 相同的仓库 - 我忘记之前已经这样做了,而且前一晚也没有完成。 - Jon z
不再正确 - 最新版本的 SVN 现在只使用一个 .svn 目录。 - ŁukaszBachman

9
$ ls -la .svn
$ rm -f .svn/lock

然后。
$ svn update

希望能对您有所帮助。

6

你可能遇到了文件名只有大小写不同的问题。如果遇到这个问题,创建另一个工作副本目录是无法解决问题的。

当前的Windows(即烂的)文件系统根本不理解FilenameFILEname之间的区别。你有两种可能的解决方法:

  1. 在支持真正文件系统的平台上检出,重命名文件并提交更改。
  2. 当你被限制在Windows上时,你可以在Eclipse SVN仓库浏览器中重命名文件,它会识别区分大小写的差异并在那里重命名文件。
  3. 你也可以使用任何命令行SVN客户端远程重命名有问题的文件,命令为:svn rename -m“broken filename case”http://server/repo/FILEname http://server/repo/filename

结果证明,这是我的问题;一位同事不知怎么地竟然提交了几个Xcode项目文件,每个文件都有两个副本,只有大小写不同而已。我使用TortoiseSVN浏览存储库并删除了多余的文件。然后我删除了包含重复文件的本地文件夹,svn更新终于成功了。 - kgriffs
这不仅仅是Windows的问题,Mac也受到影响。默认情况下,Mac的HFS+文件系统也是不区分大小写但保留大小写的文件名。为了解决这些问题,我在硬盘上设置了第二个分区,使用区分大小写的文件名。 - David W.

6

我尝试通过控制台执行 svn cleanup,但出现了以下错误:

svn: E720002: Can't open file '..\.svn\pristine\40\40d53d69871f4ff622a3fbb939b6a79932dc7cd4.svn-base':
The system cannot find the file specified.

因此,我手动创建了这个文件(为空),然后再次执行svn cleanup。这一次成功完成了。


6

我遇到了完全相同的问题。我无法提交,而且清理操作也会失败。

使用命令行客户端,我能够看到一个错误消息,指出它无法将一个文件从.svn/props移动到.svn/prop-base

我查看了具体的文件,并发现它被标记为只读。在去除只读属性后,我能够清理该文件夹并提交我的更改。


最终我放弃了那棵树,换了一棵新的。但还是感谢你提供的下次检查的提示。 - Rob Walker
哈...我甚至将 .svn\pristine 区域中的文件夹从 {name} 重命名为 {name}_old,然后再改回原来的 {name},这样就解决了问题。 - beauXjames

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接