2

我正在尝试在 CentOS 服务器上运行 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 提交之后运行脚本,它就可以工作。

4

1 回答 1

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
于 2012-10-16T01:11:05.950 回答