56

使用 svnsync

$ svnsync --non-interactive sync ${REPO}

中止该过程后,出现此错误消息并重试

Failed to get lock on destination repos, currently held by 'svn.test.com:0e4e0d98-631d-0410-9a00-9330a90920b3'  
...  
Failed to get lock on destination repos, currently held by 'svn.test.com:0e4e0d98-631d-0410-9a00-9330a90920b3'   
svnsync: Couldn't get lock on destination repos after 10 attempts  

有没有办法解决这个问题?

4

6 回答 6

65

实际上,svnsync(从 v1.7 开始)中内置了一些可以“窃取”锁的功能。

svnsync help sync

显示:

--steal-lock             : Steal locks as necessary.  Use, with caution,
                           if your mirror repository contains stale locks
                           and is not being concurrently accessed by another
                           svnsync instance.

当我运行它时,我得到了一个不错的结果:

Stole lock previously held by '[hostname]'

所以,你毕竟不需要 propdel 的东西

于 2013-04-17T07:02:30.460 回答
54

您必须通过远程站点上的 svn 命令行删除远程存储库上的锁定属性,该属性在同步期间因失败而遗留下来。

svn propdel --revprop -r0 svn:sync-lock file:///path/to/the/repository
于 2010-11-02T12:37:33.887 回答
11

从技术上讲,您需要从中删除属性的是目标存储库,不一定是远程存储库,因为目标可能是本地的。所以对于这个特定的问题:

svn propdel --revprop -r0 svn:sync-lock ${REPO}
于 2011-12-23T06:48:00.557 回答
3

卸下锁对我有用。但是,我必须使用稍微不同的命令,因为我需要发送帐户的用户名和密码以用于解锁帐户。

svn pdel --revprop -r 0 --username ??? --password ??? svn:sync-lock file:///path/to/the/repository

我还必须从存储库所在的驱动器运行此命令。(如果我的存储库在 d 上,则在运行命令之前在命令提示符中更改为 d:)

在输入用户名和密码之前,当我运行命令时出现以下错误:

revprop change blocked by pre-revprop-change hook (exit code 255)

我找到并打开了pre-revprop-change挂钩文件,其中的代码仅列出了可以进行所需更改的特定用户名。在上述命令中使用该用户名和密码删除了钩子。

于 2011-06-09T21:19:05.810 回答
3

要确认锁的存在(虽然错误显然告诉它),运行 proplist 与-verbose

svn pl --revprop -v -r 0 file:///svn/slave

然后根据需要删除道具!

于 2013-10-14T05:44:04.830 回答
2

你必须做两件事来解决这个问题。一种是删除上面提到的锁。然后您必须将 pre-revprop-change.tmpl 文件编辑为空,并使其可执行。在 Linux/Unix/Mac 上使用 chmod +x 但在 Windows 上将文件名更改为 pre-revprop-change.bat。在此之后,您可以将转储文件加载到您的存储库中,然后将其镜像到您需要的任何地方。

于 2011-11-03T16:14:52.843 回答