为什么提交切换路径时无法执行客户端挂钩脚本?

为什么提交切换路径时无法执行客户端挂钩脚本?

我有一个 SVN 存储库(版本 1.9.2),并且在 Windows 7 (x64) 计算机上使用 TortoiseSVN 客户端(版本 1.9.2)。有客户端钩子脚本(start-commit、pre-commit 和 post-commit),它们存储在存储库中,当然也可以在本地工作副本中使用。这些脚本是使用特殊属性tsvn:startcommithooktsvn:precommithook和来安装的tsvn:postcommithook,每个脚本都使用变量指向相应的脚本文件,%REPOROOT%以避免必须指定绝对工作副本路径。

当我将更改提交到存储库时,挂钩脚本(批处理文件.bat)全部正常工作。

但是,当我尝试提交对切换路径中的文件的更改时,出现以下错误:

确认消息后无法进行提交,不会出现提交对话框。

我相信这个错误不是由钩子脚本触发的(因为当我将exit 0exit 1作为唯一命令写入脚本时没有任何变化),而是由 TortoiseSVN 尝试执行它们时触发的,由于某种原因,它似乎无法再找到相应的脚本。

那么我如何使用位于存储库中并因此位于工作副本中的钩子脚本呢?


用完整的绝对路径替换变量%REPOROOT%根本不会改变行为。

当我在属性%REPOROOT%中用替换变量时,切换的路径没有任何变化(因此出现上述错误消息),但对于标准路径,没有执行任何挂钩脚本,并且毕竟没有错误消息。%REPOROOT+%tsvn:*commithook


附注:为了验证是否尝试触发挂钩脚本,我依靠 TortoiseSVN 的批准/拒绝对话框的外观:
批准或拒绝客户端钩子脚本

答案1

解决方法

要解决这个问题,只需提交切换路径的父目录,而不是切换路径本身或其子项。

只是想提一下:确实如此不是改变行为以递归应用钩子脚本属性。


钩子脚本路径的语法(属性tsvn:*hook

首先,在指定钩子脚本的路径时,非常重要的一点是,只要使用占位符%REPOROOT%%REPOROOT+%,就必须使用正斜杠/作为路径分隔符。我相信这与这些变量在内部包含存储库根目录的 URL 有关,根据文档,但不是本地工作副本 (WC) 路径。对于固定本地路径,正斜杠/和反斜杠\均可接受。
如果路径包含SPACEs,则必须将其放在引号之间;您可能通常使用引号,因为它无论如何都不会造成损害。


正常路径与切换路径、目录级别

假设我们在 有一个存储库,其中D:\TEST\repo包含/trunk/branches,顶层有一个脚本,内容为,一个文件位于,一个分支位于,另一个分支位于;工作空间在 处签出,但我们有一个/tags/hooksscript.bat/hooksexit 0file.txt/trunk/trunk/branches/test/trunk/branchD:\TEST\wc稀疏结账所以只有/trunk/hooks存在(都是完全递归的)。

tsvn:startcommithook然后在 WC 根处设置一个新属性,如下所示:
钩子脚本属性设置对话框

现在尝试在任何 WC 位置(根目录、/trunk等等)提交任何内容;出现钩子脚本批准/拒绝对话框,显示以下钩子脚本路径,这是正确的路径,因此单击“运行”后脚本实际上就会运行:
钩子脚本执行批准/拒绝对话框

现在将本地 WC 路径切换D:\TEST\wc\trunk/branches/test,然后尝试提交本地 WC 文件file.txt;这次批准/拒绝对话框显示以下错误路径:
钩子脚本执行批准/拒绝对话框

单击“运行”时,脚本无法执行,显然:
钩子脚本执行失败

但是,当将本地 WC 路径切换D:\TEST\wc\trunk/branch现在并尝试提交本地 WC 文件时file.txt,批准/拒绝对话框会再次显示正确的路径,例如多于,并且脚本能够运行。

因此,显然,正常路径和切换路径的目录层次结构中的不同深度似乎会损害占位符的正确扩展%REPOROOT%
无论钩子脚本是否已提交,此行为都是完全相同的。

已确认错误

我举报了上述行为这里,已确认是 bug那里,目前已修复r28670因此在 1.12.2 之后的版本中将不再存在。

答案2

我遇到了类似的问题。我切换到 %REPOROOT+% 以使其在分支(复制)后工作。

至于脚本,我正在运行一个批处理文件,并添加了此行以使其从批处理文件位置而不是触发文件夹运行:

cd /d %~dp0

相关内容