为svn更新发布提交挂钩

时间:2012-10-29 13:28:39

标签: svn sudo

我有一个存储库和一个工作副本。

在存储库的post-commit钩子中,我编写了一个命令来执行一个运行SVN更新命令的文件。

我的存储库位于/var/www/svnrepos/help/

我的工作副本位于/var/www/autopostcommit/help/

提交后文件位于/var/www/svnrepos/help/hooks/

在提交后我写了以下命令

    sudo /usr/local/bin/svn-post-commit-update 1>&2

在/ usr / local / bin中的svn-post-commit-update文件中,我写了以下命令。

    cd /var/www/autopostcommit/help/
    svn update --non-interactive --trust-server-cert \
               --username satish@108.166.92.199 --password mypassword

我还尝试了其他版本的命令,例如没有密码和所有。

SVN提交给我以下错误

   Error: sudo: no tty present and no askpass program specified

如何解决此错误?

3 个答案:

答案 0 :(得分:1)

您已将sudo配置为要求输入密码,但在提交后挂钩中无法执行此操作。修复似乎很简单:重新配置sudo,以便在您的情况下不会要求输入密码。

谨慎的人不想以root的身份运行post-commit挂钩。

答案 1 :(得分:0)

您需要找到一些其他方式来执行您的脚本作为正确的用户。也许制作脚本setuid是你的选择? http://en.wikipedia.org/wiki/Setuid

然后你可以删除sudo。

答案 2 :(得分:0)

真正的问题:你想做什么?

执行提交后挂钩时,正在执行提交的用户必须等待直到完成。如果您正在尝试更新远程工作目录,那么您的用户将会非常沮丧,因为每次他们进行提交时,在他们让计算机恢复之前,需要花费10到20秒的时间。

有些事情最好不要做钩子。相反,使用crontab条目只需每分钟检查一次存储库以进行更新,如果有更新,则执行它需要做的任何事情。

我认为你正在更新网页。我提出一个小建议:不要使用svn update。而是使用svn export来删除所有.svn文件(我认为版本1.7不再那么糟糕了)。我建议做的是两个目录策略:

您不直接更新/var/www/autopostcommit/help/。相反,您对另一个目录执行svn update,然后在更新完成后,将/var/www/autopostcommit/help移动到其他位置,并将您导出的目录移至/var/www/autopostcommit/help/。这样,您的/var/www/autopostcommit/help目录不处于两次修订之间的状态。