Subversion 的服务方式无关紧要,这些钩子在服务器上都以相同的方式运行。
挂钩由服务器执行。因此,您需要确保钩子本身具有执行权限集,并且它由运行 SVN 服务器的用户拥有。此外,执行钩子时,环境会被清除干净。因此,$PATH
可能不会按照您想要的方式设置。
通常,当您看到此类错误时,是由于这些问题之一。我的建议是做一个非常简单的钩子(这是 Unix/Linux 版本):
#! /bin/bash
echo "The hook has executed" >&2
exit 2
这个钩子保证会失败,这正是你想要的。当钩子失败时,打印到 STDERR 的输出将返回给用户。您应该看到如下内容:
The post-commit hook failed with the output of "The hook has executed"
如果你没有看到,你就知道 Subversion 没有执行你的钩子,这不是钩子的问题。检查上面提到的事情:执行位是否在钩子上?是执行 Subversion 服务器进程的用户拥有的钩子(和整个存储库)。(例如,通常apache
,httpd
或wwwrun
在 Apache httpd 下运行时。
由于您在 下运行svn+ssh
,因此您需要确保GROUP所有权与您的用户是同一组,正确设置了GROUP执行权限,并且所有用户的UMASK都设置为0002
而不是只是0022
.
现在,让我们看看你想要什么:
现在我想创建 SVN Hook 以便每个提交都应该直接更新到 sub.domain.tld
看来您希望在有人提交更改时更新特定的工作副本。你可以通过 pre-commit 钩子来做到这一点,但我建议你使用Jenkins来处理这类事情。
- 它将允许您跳过可能需要一段时间才能更新的提交后挂钩。例如,您可能希望在更新后重新启动服务器。当 post-commit 钩子运行时,不允许其他人进行进一步的更改。另外,进行提交的用户必须等待提交后挂钩运行。也许整个事情只需要 20 到 30 秒,但想象一下在 post-commit 钩子运行时必须等待这 20 到 30 秒的用户。
- 它会给你更多的控制权。每当我做这样的事情时,我都有两个服务器目录:我的第一个是服务器使用的活动目录。我的第二个是非活动目录,它只是坐在那里并获得更新。发生更新时,我会更新非活动目录,然后重新启动服务器并更改这两个目录。现在,我的服务器使用之前更新的非活动目录,而我的正式非活动目录等待更新。这可以防止有人在我的活动服务器目录处于更新过程中时发出服务器请求的情况。
- 这将允许进一步扩展。例如,您可能决定并非所有提交都应该更新服务器。相反,只有当用户进入 Jenkins 并请求它时,服务器才会更新。或者,也许当更新发生时,您想要运行一些测试。你当然不能用 post-commit 钩子做到这一点,但你可以用 Jenkins。也许您想更新几台服务器。同样,这对 Jenkins 来说更容易。