【问题标题】:SVN Post-Commit Export is not workingSVN 提交后导出不起作用
【发布时间】:2012-10-06 00:35:23
【问题描述】:

我正在尝试在 CentOS 服务器上运行 SVN 的提交后脚本。我想在每次提交到存储库后从 var/svn/project 运行 svn export --force 到 /var/www/project 。即使我尝试了许多替代方案,我也无法让它发挥作用。如果有人可以发布一个可以在没有任何用户权限问题的情况下运行的脚本,我将不胜感激。

/var/svn/project/hooks 下的示例 post-commit 文件:

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

如果我由 root 用户直接从 SSH 运行脚本,但不是在真正的 SVN 提交之后运行脚本。

【问题讨论】:

    标签: svn export centos centos5 post-commit


    【解决方案1】:

    我感觉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
    

    【讨论】:

    • 由于某种原因,提交后不会在提交时触发。你知道问题可能是什么吗?
    • 如果是 Unix,post-commit 脚本必须有执行权限并且可以被运行 Subversion 服务器的用户执行。如果您使用的是 Windows,则该文件必须称为 post-commit.bat 并且必须设置 PATHEXT。作为测试,如果 post-commit 钩子运行但失败,则输入 echo "POST COMMIT HOOK FAILED!" 2>&1 以打印出一些内容。
    • 它是一个 unix 服务器,我在提交后尝试了 chmod 777。仍然没有被触发。
    • 如果这是一个 shell 脚本,请将 exit 2 放在脚本的最顶部附近。这将强制提交后挂钩失败。如果执行此操作后提交后没有失败,那么我们确定脚本没有执行。否则脚本正在执行,但没有按照您的预期执行。如果钩子由于exit 2 而失败,请在各个位置放置一些echo "FOO" 1>&2 lines through out the script and put the exit 2`,以查看脚本在失败前执行了多远。 echo 语句将帮助您追踪您在脚本中的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多