【问题标题】:Unable to upgrade SVN working copy无法升级 SVN 工作副本
【发布时间】:2014-11-27 16:31:53
【问题描述】:

我有一个非常大的 svn 存储库。当我尝试使用它(提交、更新等)时,它说有锁。

当我运行“svn cleanup”时,它说工作副本太旧,我需要升级它。

当我运行 'svn upgrade' 时,它会运行,但什么也没说。

我还在 repo 上运行了“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

所以,这个客户端的 repo 是格式 31。tortoisesvn 认为它是格式 29。现在我更困惑了。

更新 2: 回复@David W

Is this about a working copy or the repository?

工作副本。虽然我也在 repo 上尝试了 svnadmin upgrade 。但是,我使用的 svnadmin 是 1.8.1。我只是尝试使用 TortoiseSVN 一(1.8.10)升级 repo,但这并没有解决问题。

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

我是唯一一个使用 repo 的人,所以我知道没有其他人锁定它。这可能是由于操作不完整。

我用 1.8.10 运行 svn status,但没有任何东西有“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

是的。如果我删除工作副本中的任何目录并点击更新,它会抱怨它已被锁定。由于格式不匹配,我无法清除锁定。理论上我可以重新签出整个 repo,然后将内容复制回来,但 repo 是 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 客户端进行升级。
  • 我也通过 TortoiseSVN 尝试了这两个命令,但错误相同。理论上,这是一个 1.8.X 客户端尝试该命令。我将尝试您所说的并写回结果。谢谢!
  • 我尝试了您的建议并使用结果编辑了问题。 TL;DR:1.7 客户端认为 repo 是格式 31,tortoiseproc (1.8.10) 和 svn (1.8.1) 都认为它是 29。所以很困惑。

标签: windows svn tortoisesvn


【解决方案1】:

我有一个非常大的 svn 存储库。当我尝试使用它(提交、更新等)时,它说有锁。

这是关于工作副本还是存储库?两种不同的东西。另外,这是因为有人锁定文件而被锁定的文件,还是因为您的工作目录由于不完整而被锁定

您可以在一个文件上设置一个 来阻止您进行提交。从命令行,您可以执行svn status 并查看锁定文件旁边的K。然后,您可以使用svn lock --force 窃取该锁,并签入您的更改。 (只要存储库中没有阻止您窃取锁的钩子)。

然后,由于操作不完整,工作目录被锁定。在这种情况下,当您执行svn status 时,您会看到L。在这种情况下,您通常可以在该工作副本的根目录中执行 svn cleanup.svn 文件夹所在的位置。)

请记住,您可以始终删除工作目录并创建一个新目录。小心混淆 Subversion 客户端。有一次,这似乎并不重要,但在 1.6、1.7、1.8 和 1.9 版本中,工作副本的结构发生了变化,可能与运行其他版本的客户端不兼容。


更新 2

是的。如果我删除工作副本中的任何目录并点击更新,它会抱怨它已被锁定。由于格式不匹配,我无法清除锁定。理论上我可以重新签出整个 repo,然后将内容复制回来,但 repo 是 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 版本附带的命令行客户端,以保证两者之间的某种一致性颠覆客户端。

清理 vs. 升级 vs. Svnadmin

很容易混淆这些。你不应该在你的工作目录上使用svnadmin 命令。 svnadmin 用于服务器。您遇到的问题完全是客户。

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

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

【讨论】:

  • 谢谢!我在上面的问题中通过编辑更新 2 回复了您。
  • @Morfie 查看我对您的回复的回复。
  • 在工作副本的根目录中执行任何命令时出现错误。这个 WC 是整个 repo 的签出根。因此,从 repo 的签出 WC 的根目录开始,错误。我希望它只是一个子目录。就 svnadmin 而言,我没有在工作目录上运行它。我更了解。我在服务器上运行它,在 repo 上。在升级方面,这个 repo 从 1.8 出来就一直是 1.8。它曾经是 1.7,但那是很久以前的事了。最后,我确实安装了我使用的 cmdline TortoiseSVN 东西。知道了这一切,我唯一的选择是 CO 整个回购吗?泰!
  • 不要签出整个仓库!只是你需要的回购的一部分。您可以只签出您正在处理的目录/项目。
  • 首先,您的“检查主干,但只获取项目目录”工作正常。我能够毫无问题地进行交互。问题是在 repo 中的 84 个根目录/项目中,我在一天内积极使用了大约 34 个。所以我可以svn up 34个目录,但我不妨重新制作整个东西。然后将我的更改从旧版本重新同步到新版本。有没有办法在不使用 SVN 命令的情况下手动杀死锁?
猜你喜欢
  • 2011-12-20
  • 2014-11-07
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多