无法升级SVN工作副本

6
我有一个非常非常大的svn仓库。当我尝试使用它(提交,更新等)时,它会显示锁定。
当我运行'svn cleanup'时,它说工作副本太旧了,需要升级它。
当我运行'svn upgrade'时,它运行了,但没有任何提示。
我还在仓库上运行了'svnadmin upgrade',以防万一。
我安装了最新的TortoiseSVN。
通常,如果我遇到SVN问题,我会将文件移出来,更新,然后将文件移回去,但正如我之前提到的,这是一个非常大的仓库。
任何帮助都将不胜感激。
谢谢!
具体信息:
>svn update
svn: E155004: Run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)
svn: E155004: Working copy '*****' locked.
svn: E155004: '*****' is already locked.

>svn cleanup
svn: E155036: Please see the 'svn upgrade' command
svn: E155036: The working copy at '*****' is too old (format 29) to work with client version '1.8.1 (r1503906)' (expects format 31). You need to upgrade the working copy first.

>svn upgrade

>

更新1:我安装了一个1.7.X客户端并尝试运行清理。不知何故,它抱怨仓库不是工作副本。我尝试使用相同的1.7.X客户端进行更新,得到以下消息:

>"c:\Program Files\SlikSvn\bin\svn.exe" update
svn: E155021: This client is too old to work with the working copy at '*****' (format 31).
You need to get a newer Subversion client. For more details, see http://subversion.apache.org/faq.html#working-copy-format-change

所以,这个客户认为仓库的格式是31。而TortoiseSVN认为它是29格式。现在我更加困惑了。
更新2: 回复@David W
Is this about a working copy or the repository?

工作副本。虽然我也尝试了对存储库的svnadmin升级。不过,我使用的svnadmin是1.8.1版本的。我刚刚尝试使用TortoiseSVN 1.8.10来升级存储库,但没有解决问题。

is this about a file that's locked because someone locked it, or because your working directory is locked due to an incomplete

我是唯一使用该仓库的人,所以我知道没有其他人锁定它。这可能是由于操作不完整造成的。
我在1.8.10下运行了svn状态,没有一个文件有“K”。有一些文件带有“L”,还有一个文件带有“?”。除了标记为“?”的一个文件外,所有列出的项都是目录而不是文件。
如果我运行“svn lock --force dirname”,它会响应该特定节点“不是文件”。当我对标记为“?”的文件运行它时,它会响应该节点“未找到”。
Then, there is a locked working directory because of an incomplete operation...

没错,你说得对。这就是为什么所有的东西都标有'L',我猜测。

当我运行清理程序(1.8.10)时,它给了我与我的初始问题相同的错误(格式29太旧,无法适用于格式31的客户端)。

Remember that you can always delete a working directory and create a new one

是的。如果我删除工作副本中的任何目录并更新,它会抱怨该目录被锁定。由于格式不匹配,我无法清除锁定。理论上,我可以重新检出整个仓库,然后将文件复制回来,但该仓库大小为12GB(210,000个文件)。

Be careful about mixing up Subversion clients

所以,我不知道我有两个客户端,但我只使用TortoiseSVN(1.8.10)。今天当我尝试解决问题时才发现我有两个客户端。

* 更新3:解决方案 * 使用@David W的提示,这是我如何解决问题的步骤: 1)备份我的.svn文件夹 2)从https://github.com/sqlitebrowser/sqlitebrowser/releases下载了一个SQLite编辑器。 3)打开我的wc.db文件并浏览WC_LOCK表。该表中有1个条目,我将其删除。 4)尝试使用TortoiseSVN(1.8.10)运行清理,之前报告了锁定问题。它终于工作了! 5)尝试在我的存储库中运行命令(更新、提交等),一切都很顺利。

感谢所有帮助过我的人,特别是@David W没有放弃我。


这可能是一个与Tortoise无关的命令行SVN:它显示的版本号是1.8.1,而最新的Tortoise版本应该是1.8.10。鉴于它显示这是一个1.7.x WC(格式29),您可以尝试获取一个1.7命令行SVN,并在运行svn cleanup之后再返回到您的1.8.x客户端进行升级。 - Rup
我也尝试了使用TortoiseSVN的这两个命令,但是出现了相同的错误。理论上,这是1.8.X客户端尝试执行该命令。我将尝试您所说的并回复结果。谢谢! - Morfie
我尝试了你的建议,并在问题中编辑了结果。简而言之:1.7客户端认为repo是格式31,tortoiseproc(1.8.10)和svn(1.8.1)都认为它在29上。非常困惑。 - Morfie
1个回答

5
我有一个非常大的svn仓库。当我尝试使用它(提交、更新等)时,它会显示锁定状态。
这是关于工作副本还是仓库?两个不同的事情。此外,这是因为某人锁定文件还是因为你的工作目录由于未完成操作而被锁定。
你可以有一个锁定文件,阻止你进行提交。从命令行,你可以执行svn status并在锁定文件旁边看到K。然后,你可以使用svn lock --force窃取该锁,并检查你的更改。(只要仓库中没有防止你窃取锁定的钩子)。
然后,由于未完成操作,工作目录被锁定。在这种情况下,当你执行svn status时,你会看到一个L。在这种情况下,通常可以在该工作副本的根目录(.svn文件夹所在的位置)中执行svn cleanup
记住,你可以始终删除工作目录并创建一个新的。小心不要混淆Subversion客户端。曾经似乎并不那么重要,但在1.6、1.7、1.8和1.9版本中,工作副本的结构已经发生了变化,可能与运行其他版本的客户端不兼容。
更新2
如果我删除工作副本中的任何目录并执行更新,它会抱怨已被锁定。我无法清除锁定,因为格式不匹配。我可以理论上重新检出整个仓库,然后将文件复制回来,但仓库有12GB(210,000个文件)。
删除目录然后执行svn up不会清除锁定问题。我是指删除整个工作目录,然后重新执行svn co。你不必检出整个仓库。你只需要检出你需要的东西。你需要所有的21万个文件吗?我怀疑。
$ svn co http://server/repo            # NOOOO!
$ svn co http://server/repo/trunk      # A bit better, but do you need all
                                       # the projects under Trunk?
$ svn co http://server/repo/trunk/foo  # Now, I'm just checking out foo
$ svn co http://server/repo/trunk/bar  # Now, I'm just checking out bar

这里检查了两个工作目录:一个是用于foo,另一个是用于bar
如果你真的非常想要检出整个主干,可以使用--depth来稀疏地检出你需要的内容:
# Checking out trunk, but only getting the project directories
$ svn co http://server/repo/trunk --depth=immediates
$ svn up --set-depth=infinity foo
$ svn up --set-depth=infinity bar

在理论上,我正在检查整个主干,但我只得到了空的主项目目录。我只能从项目foobar获取文件。然而,foobar共享一个工作目录。假设我在foo上开始进行长时间的更新,然后我去bar尝试提交。我会收到一个警告,告诉我工作目录被锁定了。即使它们位于工作目录的不同部分,我也无法对同一工作目录执行两个单独的Subversion命令。

所以,我不知道自己有两个客户端,但我只只只使用TortoiseSVN(1.8.10)。今天我只是在尝试解决问题时才发现我有两个客户端。

如果您安装了Tortoise,则还可以安装Subversion命令行客户端,这是一个可选安装项。我强烈建议这样做!不要使用从其他地方下载的命令行客户端(如SlikSVN或CollabeNet)。并不是这些客户端不好,而是应该使用与您的TortoiseSVN版本捆绑的命令行客户端,以保证两个Subversion客户端之间的某种平等。

清理vs.升级vs. Svnadmin

很容易混淆它们。您不应在工作目录上使用svnadmin命令。 svnadmin是用于服务器的命令。你的问题严格来说是客户端的问题。

随着Subversion从1.6到1.7再到1.8,现在到1.9,upgrade将升级您的工作目录到新格式。完成后,您无法返回到旧格式。您升级到1.8格式后,1.7和1.6客户端将不再起作用。

Cleanup是帮助删除由于不完整的Subversion客户端命令而导致的锁定。


@Morfie 请查看我的回复。 - David W.
当我在Working Copy的根目录执行任何命令时,会出现错误。这个WC是整个repo的签出根目录。所以从签出的repo的根目录开始,就会出现错误。我希望它只是一个子目录。就svnadmin而言,我没有在工作目录上运行它。我知道得更好。我是在服务器上,对repo进行操作。关于升级,这个repo自1.8发布以来一直是1.8。它曾经是1.7,但那是很久以前的事了。最后,我确实安装了cmdline TortoiseSVN的东西,我也使用它。在了解所有这些情况之后,我的唯一选择是CO整个repo吗?谢谢! - Morfie
不要检出整个代码库!只需检出您需要的代码库部分。您可以仅检出您正在工作的目录/项目。 - David W.
locks 是 SQLITE 数据库中 .svn 目录的一部分。当 SVN 执行可能更改工作目录的命令时,SVN 会锁定数据库以防止冲突。如果命令未完成,则数据库永远不会解锁。这就是为什么有 svn cleanup 命令的原因。SVN 的 1.7 到 1.9 版本是从 FSFS 过渡到真正的数据库。这将使添加功能更容易,并在诸如合并之类的任务上做得更好。 - David W.
已解决!请看我对原问题的编辑。再次感谢您! - Morfie
显示剩余2条评论

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