1

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

在存储库的提交后挂钩中,我编写了一个命令来执行一个运行 SVN 更新命令的文件。

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

我的工作副本在/var/www/autopostcommit/help/

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

在提交后我写了以下命令

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

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

    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

我怎样才能克服这个错误?

4

3 回答 3

1

您已配置sudo为要求输入密码,这在 post-commit 挂钩中无法做到。修复似乎很简单:重新配置sudo,这样它就不会在您的情况下要求输入密码。

谨慎的人无论如何都不想运行 post-commit 钩子root

于 2012-10-29T16:39:21.977 回答
0

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

然后你可以删除 sudo。

于 2012-10-29T13:44:54.520 回答
0

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

当您执行提交后挂钩时,正在执行提交的用户必须等待它完成。如果您尝试更新远程工作目录,您的用户会非常沮丧,因为每次他们进行提交时,他们都需要花 10 到 20 秒的时间来转动拇指,然后才能恢复他们的计算机。

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

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

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

于 2012-10-29T20:08:21.900 回答