【问题标题】:Post commit hook for the svn updatesvn 更新的提交后挂钩
【发布时间】:2012-10-18 19:46:26
【问题描述】:

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

在存储库的提交后挂钩中,我编写了一个命令来执行一个运行 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

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

【问题讨论】:

    标签: svn sudo


    【解决方案1】:

    您已将sudo 配置为要求输入密码,而在提交后挂钩中它无法做到这一点。修复似乎很简单:重新配置sudo,这样它就不会要求您输入密码了。

    谨慎的人无论如何都不想以root 运行提交后挂钩。

    【讨论】:

      【解决方案2】:

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

      然后你可以删除sudo。

      【讨论】:

      • Setuid 在 shell 脚本中被忽略。
      【解决方案3】:

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

      当您执行提交后挂钩时,正在执行提交的用户必须等待直到完成。如果您尝试更新远程工作目录,您的用户会非常不高兴,因为每次他们进行提交时,他们需要 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 目录就不会处于两个修订之间的状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 2011-04-29
        • 2014-08-10
        • 2016-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多