如何通过svn post-commit钩子运行svn update

时间:2010-12-02 23:21:35

标签: linux svn apache ubuntu post-commit

目标:使用最新的svn提交更新/var/www

ubuntu服务器10.10,最新的apache2,最新的svn,位置:/var/svn/[projectname]

为此,我创建了一个简单的提交后脚本:

#!/bin/bash

#tests if www-data user runs this script on commit (which it does)
touch /tmp/test.log

#works when run from the command line (sudo ./post-commit) but not when run by www-data
sudo /usr/bin/svn update /var/www

要解决第二个命令不能用作www-data的问题,我试过......

修改:sudo visudo并添加(最后):www-data ALL=(ALL) NOPASSWD:ALL

Chowning:/var/wwwwww-data:www-data

Chmoding:所有/var/www到777

仍然没有运气......任何想法?

2 个答案:

答案 0 :(得分:1)

如果您运行该怎么办:

  su - www-data -c '/usr/bin/svn update /var/www'

(如果/ var / www /是777且由www-data拥有,则不需要sudo。)

作为root用户? (然后它suid()作为www-data并运行命令)。 它应该提供有关实际失败的更多信息。

或者,您可以尝试记录提交后挂钩的svn update输出:

/usr/bin/svn update /var/www &> /tmp/my-svn-update.log

我认为这两项测试可以为您提供有关所发生事件的更多信息。

SIDE注意:我不确定你是否真的想冒险让www-data能够以root用户身份运行任何命令..如果你绝对需要让它运行svn作为root(我没有看到它的意思,但它可能是),只需在/ etc / sudoers中使用它:

www-data ALL=NOPASSWD: /usr/bin/svn

答案 1 :(得分:0)

我首先使用您建议的日志记录机制,并帮助修复它!谢谢!

输出的错误与repro中的文件名无关,无法转换为UTF-8。我删除了文件,但它确实有效。但是为什么它在直接调用post-commit时起作用...我不知道。

顺便说一句,我错误地认为它是bash(它是sh)所以我不得不改变&>到2>

此外,我删除了签出的文件,将权限和所有者重置为/ var / www上的正常,然后再将其重新检出。

我最后的sudoers线:

www-data ALL=NOPASSWD:/usr/bin/svn update /var/www

非常感谢你的帮助!