我正在尝试在CentOS Server上运行SVN的提交后脚本。我想在每次提交到存储库后,将var / svn / project中的svn export --force运行到/ var / www / project。即使我尝试了很多替代品,但我还是无法让它发挥作用。如果有人可以发布一个没有任何用户权限问题的脚本,我将不胜感激。
/ var / svn / project / hooks下的提交后文件示例:
#!/bin/sh
sudo /usr/bin/svn export --force svn://domain/var/svn/project /var/www/project
如果我是root用户直接从SSH运行脚本,但在真正的SVN提交后没有。
答案 0 :(得分:2)
我感觉sudo
失败了。
真的不重要,因为你想要做的是 坏主意 。存储库导出有多大?这需要多长时间。 20秒? 2分钟?
想象一下,您是Subversion用户,并尝试签入更改。你做了提交,突然你的终端似乎冻结了。也许是20秒,也许是两分钟。无论后提交挂钩完成什么都需要。男孩,你觉得自己,Subversion太慢了......
更好的方法是使用crontab。而且,如果你有能力以root身份做事,你当然可以做一个crontab。
跟踪最后一次Subversion修订。然后,如果您检测到更改,则执行导出。简单的脚本,易于实现,并且在等待导出时不会冻结Subversion。
顺便说一句,用户正在运行Subversion服务器进程。那是执行钩子的用户。如果您的/etc/sudoers
文件集中的用户不需要密码,则您的提交后挂钩将失败。此外,Subversion挂钩没有路径,因此他们无法找到sudo
命令,您必须在其前面加上它所在的目录。
尽管如此,即使你让它发挥作用,它仍然是一个 坏主意 。
尝试创建一个可以满足您需求的crontab。完全未经测试。我今晚根本没有时间。但是,它会给你一个想法:
#! /bin/bash
REPO_URL="http://...."
DIR=... #Where you want the export
LAST_REV_FILE=/var/run/svn.last.rev
SVN=/usr/bin/svn
SED=/usr/bin/sed
current_rev=$($SVN info $REPO_URL | $SED -n '/^Revision: /s/^Revision: //p')
if [ ! -f $LAST_REV_FILE ]
then
echo $current_rev > $LAST_REV_FILE
exit 0
fi
#You're here if there is a last.rev.file
last_rev=$(echo $LAST_REV_FILE)
[ $last_rev -ge $current_rev ] && exit 0
# New Revision
echo $current_rev > $LAST_REV_FILE
rm -rf $DIR
$SVN export $REPO_URL $DIR