我有一个存储库和一个工作副本。
在存储库的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
如何解决此错误?
答案 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
目录不处于两次修订之间的状态。