SVN中的工作副本XXX被锁定并且清理失败

601

我执行svn update时出现以下错误:

工作副本 XXXXXXXX 被锁定,请执行“清理”命令

当我运行清理命令时,出现以下提示:

清理无法处理以下路径:XXXXXXX

我该如何跳出这个循环?


5
我也收到了这个消息。提供的答案看起来有点繁琐(尤其是得票最高的答案)。我只是关闭了VS,重新打开了解决方案,然后一切都能够正常检查。 - oscilatingcretin
根据eakka的评论,使用Firefox的SQLLite Manager从WORK_QUEUE表中删除条目解决了我的问题。 - zeppelin
14
很简单,只需勾选“破解锁定”选项即可清理您的工作副本。 - Farhan
我甚至没有得到打破锁定选项的选择。 - Ankita Biswas
我的问题是我的机器空间不足,我是在尝试实施几种列出的解决方案时发现的。症状相同,但原因完全不同。 - undefined
50个回答

525

一种解决方法是:

  1. 将已编辑的项目复制到另一个位置。
  2. 删除包含问题路径的文件夹。
  3. 通过Subversion更新包含文件夹。
  4. 根据需要将文件复制回来或合并更改。
  5. 提交

另一种选择是删除顶层文件夹并重新检出。但希望不必采取此措施。


125
谢谢你提供这个解决方法,不仅解决了原作者(和我)的问题,还提供了5个步骤来解决任何svn问题。对于需要这样的解决方法,subversion评分为-1。 - pxl
34
虽然从技术角度讲这是可行的,但与去掉锁定相比,这种做法实在太糟糕了,值得被点踩。 - Jukka Dahlbom
8
我无法完成第三步,因为出现了“工作副本已被锁定”的错误提示。 - Evgeny
21
考虑 BradS 的建议:“对我来说,关键是在我的工作副本顶层运行 'svn cleanup' 命令,而不是在出现问题之前一直在工作的文件夹中运行。” - Marco
5
对于使用Tortoise SVN的用户,您可以在签出目录的根文件夹上运行Clean Up并强制中断锁定。此外,您还可以要求其删除未版本化的文件。然后进行更新。 - Obaid
显示剩余6条评论

489
对我来说,诀窍是在我的工作副本的顶级目录下运行svn cleanup,而不是在出现问题之前一直在工作的文件夹中运行。

4
这对我与一个运行1.7版本的客户端有效,尽管服务器仍然是1.6.x版本。 - Mark Hosang
1
我将Intu的答案提示与此答案结合起来:查找具有“.svn”文件夹中“lock”文件的父文件夹,然后在那里运行“svn cleanup”。这对我很有效。 - rob74
我在最顶层的文件夹上运行了一次清理,解决了解锁问题,现在我可以再次进行签入操作了。 - rams
在Mac上使用Subversion,从Working Copy菜单中选择“Clean”。 - geerlingguy
5
这个方法对我管用,比Chuck的方法快多了。所以最好先试一下这个方法。 - goamn
显示剩余7条评论

210
在您的.svn文件夹中,会有一个名为lock的文件。删除该文件,您就可以进行更新了。每个子目录的.svn目录中可能还有更多的锁定文件。它们也需要被删除。可以通过命令行批处理来完成这个操作,例如:
find . -name 'lock' -exec rm -v {} \;

请注意,您正在手动编辑.svn文件夹中的文件。它们被放在那里是有原因的。这个原因可能是一个错误,但如果不是的话,您可能会损坏您的本地副本。
来源:http://www.svnforum.org/2017/viewtopic.php?p=6068

8
+1我认为这比当前投票最高的答案更好-我讨厌首先将文件复制到其他地方来解决这个(常见的!)问题。我的问题是由一个代码生成工具生成了与其他人已经添加到SVN的相同名称的文件所致。我应该在操作前先执行"svn up"... - alpian
44
在Tortoise/SVN 1.7版本中,这种方法已经行不通了(至少我找不到任何锁定文件,因为现在有一个集中式的元数据数据库)。 - pesche
10
这是一个快速的一行命令,可以递归删除当前目录下以".svn/lock"开头的所有锁定文件:find . | grep ".svn/lock" | xargs rm - Jesse
1
在我的情况下,无法找到任何锁定文件。 - Tim MB
1
源链接已失效。 - ddagsan
显示剩余3条评论

112

最简单的方法:

  1. 进入 项目上级目录(文件夹)
  2. 右键点击
  3. 点击 TortoiseSVN 然后点击 Clean up...
  4. 清理对话框会自动弹出
  5. 选择 清除工作副本状态解除锁定修复时间戳压缩原始拷贝刷新外部内容包含外部内容
  6. 按下 确定

你已成功完成任务。

查看屏幕截图以供参考。

第一步:

enter image description here

第二步: 启用解除锁定选项(清理弹出窗口中的第二个复选框) enter image description here

希望这会对你有很大帮助。


10
"在我的情况下,“断开锁定”选项就足够了,也许先尝试使用它就可以了。" - Donatello
好的答案。我在这个问题上遇到了“对话盲”,从未检查过清理选项。历史上,“导航到根并清理”曾经起作用,但我想在我的情况下打破锁就足够了。 - Phil Cooper
1
我也试过了,有效! - Daniel Silva
没有想到“破解锁定”会奏效,因为我没有创建任何锁。但显然它可以破解导致此问题的svn-内部锁。谢谢! - basher
1
这个有效 2023。 - dotrinh PM
这个方法有效,有几个被锁定的目录。我不得不分别清理它们,而不是清理根目录。 - Amila Weerasinghe

111
在我的情况下,我通过手动删除WC_LOCK表中的SQLite“.svn \ wc”文件锁记录来解决了它。
我使用SQLite编辑器打开了“WC”文件并执行了操作。
delete from WC_LOCK

截图显示从WC_LOCK中清除所有条目

根据eakkas的评论,您可能还需要删除WORK_QUEUE表中的所有条目。


1
这对我在Windows上的Subversion 1.7.5有效。从此处下载了SQLite Expert试用版:http://www.sqliteexpert.com/download.html。在SQL选项卡中运行上面的“delete” SQL语句。 - M Katz
3
一个免费的 DI SQL Spy 也可以达到目的:http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index - Gad D Lord
12
这个方法对我也起作用了,但我还需要清空WORK_QUEUE表中的条目。 - eakkas
6
删除WC_LOCK中的项目并没有起作用 - 成功的做法是查看我的WORK_QUEUE项的blob内容,果然是有问题的文件 - 我从仓库浏览器中删除了该文件,然后删除了work_queue项 - 完成后运行了清理操作,现在一切正常! - GregM
对我来说,文件是.svn/wc.db。我必须从WORK_QUEUE中删除问题条目。 - bdrx
显示剩余9条评论

48

我的同事在工作中经常看到这个消息,对他来说是因为他从SVN版本控制下删除了一个目录,但没有从SVN中删除它,然后用相同的名称创建了一个不在版本控制下的新目录。

如果这是你的问题...:

有不同的方法可以解决它,具体取决于目录是如何/为什么被替换的。

无论如何,你可能需要:

A)将现有目录重命名为临时名称

B)进行SVN还原以恢复从文件系统中删除的目录,但未从SVN中删除的目录

从那里,你可以:

A)将相关文件复制到已删除的目录中

B)如果你在目录中有重大变化,请在原始目录上执行SVN删除、提交,然后将你的新目录重新命名为所需名称,并执行SVN添加,以便将 目录置于版本控制下。


1
你的第二步 B) 对我来说似乎是一个非常糟糕的想法,因为它会破坏原始目录项目的修订历史记录,而这些项目在新版本中被保留。 - Dunaril
当人们从文件系统中删除了一个版本化的目录但没有从 SVN 中删除时,很糟糕的事情就会发生。上面的答案可能不是完美的恢复,但它是一种恢复方法。 - Teemu Leisti

39

对我来说,以上解决方案都不起作用。我通过打破锁找到了一种解决方案。当我执行svn cleanup时,我选择了“Break Locks”和“Clean up working copy status”。

输入图像描述


对我来说,在Tortoise SVN仓库浏览器中打破锁定是有效的。在已检出的文件夹上打破锁定没有任何作用。 - Bhargava Mummadireddy

23

这种方法对我有用。

  1. 进入根目录,
  2. 右键点击并进行清理操作,
  3. 勾选所有可用选项,
  4. 点击确定。

清理后,您就可以更新到最新版本了。


2
这对我也起作用。您需要检查所有可用选项(在我的版本中有6个条目)以进行清理;如果仅选中[清理工作副本状态]和[包括外部]选项,则会失败。 - Vincent Jia
1
这对我完全奏效了...只需右键单击项目 > 团队 > 清理。没有必要从 .svn 中删除任何行或其他任何东西。只有这个就可以了。谢谢! - msqar
这在TortoiseSVN 1.7.4版本中对我也起作用了。我选择了默认的复选框。 - slm
今天帮了我一下,但我不需要检查所有可用选项。我没有检查最后三个撤消我的更改,但它仍然有效。另请参见https://dev59.com/3XVC5IYBdhLWcg3w-mVO#35192644。 - EMBarbosa
1
这对我有用。我只是勾选了“清理工作副本状态”、“打破锁定”和“包括外部”。 - Phiber
显示剩余2条评论

11

对我来说,有点责任在于Tortoise。它只是抱怨“无法清理,运行清理”,但当我运行命令行(svn cleanup)时,它明确告诉我它无法删除一些正在使用的文件,而解决方法很明显。一旦我关闭了Visual Studio(它一直保持这些文件开启状态),那么清理就可以正常工作。

其他程序也可能会保持repo中的文件处于打开状态,从而导致此问题。 Excel保持xls文件开启是另一个罪魁祸首,因此关闭可能使用repo中任何内容的所有程序,甚至重启以强制程序关闭,然后再尝试清理是明智的。


7

我遇到了这个问题,因为外部文件夹不想链接到现有文件夹中。如果您在目标是已存在的(版本化或非版本化)文件夹的情况下添加svn:externals属性行,则会出现SVN工作副本锁定错误。在此情况下进行清理也会告诉您一切正常,但仍然无法更新。

解决方案:从存储库中删除有问题的文件夹,并在设置了svn:externals属性的根文件夹中进行更新。这将创建该文件夹,一切都会恢复正常。

我遇到这个问题是因为文件的svn:externals需要目标文件夹受版本控制。在我注意到这在不同存储库之间不起作用后,我从外部文件切换到外部文件夹并陷入了困境。


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