4

我已经为此工作了一段时间,但找不到解决方案(如果有的话)。

那么问题来了:有没有办法svn update通过 HTML 网络表单发出请求?

我已经测试了多个基于 Web 的 SVN 客户端(包括构建我自己的客户端),但它们都无法进行更新。

我知道这是 PHP 使用的用户权限的问题,但是即使我将系统上的所有文件都设置为777(在虚拟机上尝试过),我仍然无法存档它。

有人有这方面的经验吗?

已经谢谢你了。

我还检查了所有目录并将所有者设置为Everyone具有完全访问权限。现在不可能有​​许可问题......我想。

最后编辑: 如果脚本文件不在svn目录的根目录中,我似乎无法执行SVN。最终代码现在看起来像这样:http ://codepad.org/Kb2K8e6m

4

3 回答 3

4

以下功能或多或少应该为您完成。它还打印出:

  1. 它在 shell 中执行的确切命令
  2. 命令的输出(包括错误),以便它也可以被调试。

function updatesvn() {

    if ( isset($_POST) ) {

        //Get svn username and password from request parameters

        $username = <your_svn_username>;
        $password = <your_svn_password>;

        //Get version number to move to
        $values = $_POST;
        $version = $values['revision'];

        //validate version number

        //Path where you have checked out your project
        $rpath = '/var/www/myproj';

        //Command to svn update
        $cmd = "cd $rpath; svn cleanup; svn --non-interactive --username $username --password $password update -r $version 2>&1";

        echo $cmd;
        $out = shell_exec($cmd);

        echo $out;
    }
}

编辑:谨防此代码中的安全漏洞。我在这里简化了它。我们曾在我们的一个应用程序中使用它,在该应用程序中,达到这一点的用户被预先验证为AdminWeb 应用程序的用户。此外,此代码在 MVC 框架中执行,其中输入验证在控制器中执行操作之前在中心位置完成。

于 2012-08-01T08:00:55.130 回答
1

您可以只使用PECL svn 扩展中的svn_update() (或exec和命令行 svn - 实际上没有太大区别)。

对于权限问题,我更喜欢的解决方案是002为所有将要更新的用户(包括www-data或任何您的网络服务器用户)设置 umask,将它们放入一个公共phpuser组中,将该组设置为工作副本的根目录(chgrp phpuser <rootdir>-结帐之前!),确保它是组可写的(chmod g+rwx <rootdir>)并将其设置为setgid(chmod g+s <rootdir>),但如果您不关心保留文件权限,那么肯定chmod -R 777 <rootdir>要简单得多。

于 2012-08-03T13:03:18.303 回答
0

您正在构建持续集成服务器吗?为什么要让任何 Joe Bloggs 更新您的本地存储库?

您必须在后端有一些代码才能在 shell 中执行“svn update”。

通常,基于 Web 的 SVN 客户端会直接输入 SVN 存储库,并且默认情况下是最新的——它甚至可以让您查看以前的版本和差异。

于 2012-08-01T07:21:46.540 回答