2

我大约一个月前建立了一个 SVN 存储库,经过一番努力后,我得到了一个 post-commit 挂钩,可以在开发服务器上更新我的网站的工作副本。它工作了好几天,然后,昨天,突然间,它停止了。

我正在从我网络上的服务器运行 VisualSVN Server。据我所知,Web 服务器或托管 VisualSVN 服务器的服务器没有任何变化。VisualSVN 服务器在过去几天没有在事件查看器中显示任何事件,所以我看不到是否有错误,也找不到任何特定于 SVN 的日志文件。当我运行'svn log'时,它只显示提交。我不确定如果有错误,它是否会显示错误。

这是正在运行的脚本的清理副本:

@ECHO OFF

setlocal enableDelayedExpansion

svnlook dirs-changed %1 -r %2 | findstr /b /i "trunk" 

IF %ERRORLEVEL% EQU 0 (
    FOR /F "tokens=2" %%a IN ('svnlook changed %1 -r %2') DO (
    SET NEWA=%%a 
    SET "NEWB=!NEWA:trunk/=!"
    svn update \\<server-name>\<share>\dev\<working-copy-directory>\!NEWB! --username <svnuser> --password <svnpass>) 
)

endlocal

我还检查了服务器上的任何锁,但没有发现任何锁,并在我的 DEV 服务器上运行了工作副本的清理,一切都无济于事。我还尝试从另一个工作站进行更新,只是想看看它是否可能是我的本地计算机并且它仍然没有正常运行。最后,我还尝试从命令行运行脚本,它会运行并更新工作副本。实际上似乎服务器没有运行它。

非常感谢调试此问题的任何帮助。

更新:在找到一些调试策略后,我能够通过包含如下命令来确认该钩子确实正在运行:

echo hook ran at %date% %time% >> debug.txt

正如预期的那样,这记录了提交。我还包含了类似的调试代码,以确保钩子捕获了正确的主干/分支,并且我还让它在更新之前记录了目录,所以我新建了它将运行该命令。所有这一切都做到了。然后,为了尝试记录服务器响应,我将更新代码更改为以下内容:

svn update \\<server-name>\<share>\dev\<working-copy-directory>\!NEWB! --username <svnuser> --password <svnpass> >> debug.txt)

这根本不返回任何内容。我对此完全不知所措。

更新2:当我测试这个问题时,我之前没有得到这个,但是现在当我自己运行命令时......

svn update \\<server>\<share>\dev\<working-copy>\ScriptContent\test.cfm --username <svnuser> --password

它返回“svn: E020024: Error resolve case of”并吐出我刚刚给它的路径。

我确实尝试用谷歌搜索这个问题的一些来源,但我发现的唯一一件事是建议用斜杠切换反斜杠,但它返回完全相同的错误,但斜杠切换回反斜杠。

更新 3:为了检查错误是否与作为网络服务运行并尝试通过 UNC 路径访问工作副本的服务器有关,我尝试将服务更改为以我的名义运行并映射网络驱动器并使用脚本中的这个映射驱动器。该测试没有给我任何错误,但没有执行更新。

此外,我想得越多,我在上面的 UPDATE 2 中从命令行得到的错误可能不是脚本运行时发生的情况,因为客户端的提交屏幕(由 TortoiseSVN 运行)会显示我的错误。它没有显示任何错误。

所以,这就是我所知道的。

  1. 该脚本运行了好几天
  2. 该脚本在周末的某个时间突然停止工作
  3. 没有对托管工作副本的服务器或运行存储库的服务器进行任何更改
  4. 钩子不会产生任何错误(因为这些会显示在 TortoiseSVN 提交屏幕中)。
  5. svn update 命令未执行。

我完全不知所措。

4

2 回答 2

1

经过几天的努力,我终于找到了解决方案。默认情况下,VisualSVN 服务器在网络服务用户帐户上运行。为了解决这个问题,我遵循了这些步骤。

  1. 在存储库服务器上将用户帐户设置为 VisualSVN Server Admins 组的成员
  2. 分配 VisualSVN 服务器服务在此帐户下运行
  3. 将 Web 服务器上的用户帐户设置为 Administrators 组的成员,其名称和密码与存储库服务器上的帐户相同
  4. 重新启动 VisualSVN 服务器服务

之后它起作用了。钩子正在文件上运行 SVN 更新,完全符合预期,并使用提交的更改更新 Web 服务器工作副本。我希望这对其他人也有帮助,因为要弄清楚这一点需要做很多工作。

于 2013-11-07T13:58:25.413 回答
0

你所做的很不安全!不要将服务帐户添加到管理员组。

就我现在所见,根本原因是对共享工作副本的访问权限不足

您必须向 VisualSVN Server 的服务帐户提供对共享的访问权限。(NTFS 和共享权限)。默认情况下,VisualSVN Server 的服务在“网络服务”帐户下运行。此帐户在网络上被标识为 COMPUTER 帐户。因此,您必须为 COMPUTER 帐户提供访问工作副本所在共享的权限。如果您仍打算在专用帐户下运行服务器:文章http://www.visualsvn.com/support/topic/00024/是必读的!

于 2013-11-07T16:40:54.673 回答