2012-10-16 49 views
1

我想在CentOS服务器上运行SVN后提交脚本。我想在每次提交资源库之后,从var/svn/project运行svn export --force到/ var/www/project。尽管我尝试了很多方法,但却无法让它工作。我很感激,如果有人可以发布脚本,将运行没有任何用户权限问题。SVN后提交导出不起作用

实例提交后在/ var/SVN /项目/钩子文件:

#!/bin/sh 
sudo /usr/bin/svn export --force svn://domain/var/svn/project /var/www/project 

,如果我直接从SSH的root用户运行该脚本,但不是真正的SVN提交后,它的工作原理。

回答

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 
+0

由于某种原因后提交不会触发提交。你有什么想法是什么问题? – fiatux

+0

如果这是Unix,则提交后脚本必须具有执行权限,并且可以由运行Subversion服务器的用户执行。如果您在Windows上,则必须将该文件命名为post-commit.bat,并且必须设置PATHEXT。作为一个测试,把'echo“POST COMMIT HOOK失败!” 2>&1'打印出一些东西,如果post-commit钩子运行但失败。 –

+1

它是一个unix服务器,我试着在提交后尝试chmod 777。仍然没有被触发。 – fiatux