我有一个 SVN 存储库(版本 1.9.2),并且在 Windows 7 (x64) 计算机上使用 TortoiseSVN 客户端(版本 1.9.2)。有客户端钩子脚本(start-commit、pre-commit 和 post-commit),它们存储在存储库中,当然也可以在本地工作副本中使用。这些脚本是使用特殊属性tsvn:startcommithook
、tsvn:precommithook
和来安装的tsvn:postcommithook
,每个脚本都使用变量指向相应的脚本文件,%REPOROOT%
以避免必须指定绝对工作副本路径。
当我将更改提交到存储库时,挂钩脚本(批处理文件.bat
)全部正常工作。
但是,当我尝试提交对切换路径中的文件的更改时,出现以下错误:
确认消息后无法进行提交,不会出现提交对话框。
我相信这个错误不是由钩子脚本触发的(因为当我将exit 0
或exit 1
作为唯一命令写入脚本时没有任何变化),而是由 TortoiseSVN 尝试执行它们时触发的,由于某种原因,它似乎无法再找到相应的脚本。
那么我如何使用位于存储库中并因此位于工作副本中的钩子脚本呢?
用完整的绝对路径替换变量%REPOROOT%
根本不会改变行为。
当我在属性%REPOROOT%
中用替换变量时,切换的路径没有任何变化(因此出现上述错误消息),但对于标准路径,没有执行任何挂钩脚本,并且毕竟没有错误消息。%REPOROOT+%
tsvn:*commithook
答案1
解决方法
要解决这个问题,只需提交切换路径的父目录,而不是切换路径本身或其子项。
只是想提一下:确实如此不是改变行为以递归应用钩子脚本属性。
钩子脚本路径的语法(属性tsvn:*hook
)
首先,在指定钩子脚本的路径时,非常重要的一点是,只要使用占位符%REPOROOT%
或%REPOROOT+%
,就必须使用正斜杠/
作为路径分隔符。我相信这与这些变量在内部包含存储库根目录的 URL 有关,根据文档,但不是本地工作副本 (WC) 路径。对于固定本地路径,正斜杠/
和反斜杠\
均可接受。
如果路径包含SPACEs,则必须将其放在引号之间;您可能通常使用引号,因为它无论如何都不会造成损害。
正常路径与切换路径、目录级别
假设我们在 有一个存储库,其中D:\TEST\repo
包含/trunk
、/branches
,顶层有一个脚本,内容为,一个文件位于,一个分支位于,另一个分支位于;工作空间在 处签出,但我们有一个/tags
/hooks
script.bat
/hooks
exit 0
file.txt
/trunk
/trunk
/branches/test
/trunk
/branch
D:\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%
。
无论钩子脚本是否已提交,此行为都是完全相同的。
已确认错误
答案2
我遇到了类似的问题。我切换到 %REPOROOT+% 以使其在分支(复制)后工作。
至于脚本,我正在运行一个批处理文件,并添加了此行以使其从批处理文件位置而不是触发文件夹运行:
cd /d %~dp0