Php 在Windows&;上通过Web表单更新SVN;Linux机器

Php 在Windows&;上通过Web表单更新SVN;Linux机器,php,svn,Php,Svn,我已经为此工作了一段时间,但我找不到解决方案(如果有) 因此,问题是:有没有办法通过HTML web表单执行svn更新请求? 我已经测试了多个基于web的SVN客户端(包括构建自己的客户端),但它们都不可能进行更新 我知道这是PHP使用的用户权限的问题,但即使我将系统上的所有文件设置为777(在虚拟机上尝试过),我仍然无法将其存档 有人有这方面的经验吗 已经谢谢你了 我还浏览了所有目录,并将owner设置为具有完全访问权限的everybody。现在不可能有权限问题了。。。我想 上次编辑: 如果脚

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

因此,问题是:有没有办法通过HTML web表单执行
svn更新
请求?

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

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

有人有这方面的经验吗

已经谢谢你了

我还浏览了所有目录,并将owner设置为具有完全访问权限的
everybody
。现在不可能有权限问题了。。。我想

上次编辑:
如果脚本文件不在SVN目录的根目录中,我似乎无法执行SVN。最后的代码如下所示:

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

后端必须有一些代码才能在shell中执行“svn更新”


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

以下功能或多或少可以为您完成此操作。它还打印出:

  • 它在shell中执行的确切命令
  • 命令的输出(包括错误),以便也可以对其进行调试

  • 函数updatesvn(){
    国际单项体育联合会(国际单项体育联合会){
    //从请求参数获取svn用户名和密码
    $username=;
    $password=;
    //获取要移动到的版本号
    $values=$\u POST;
    $version=$values['revision'];
    //验证版本号
    //签出项目的路径
    $rpath='/var/www/myproj';
    //命令以更新svn
    $cmd=“cd$rpath;svn cleanup;svn--非交互式--用户名$username--密码$password update-r$version 2>&1”;
    echo$cmd;
    $out=shell_exec($cmd);
    回音$out;
    }
    }
    
    编辑:谨防此代码中的安全漏洞。我在这里简化了它。我们在其中一个应用程序中使用了它,其中达到这一点的用户被预先认证为web应用程序的
    Admin
    用户。此外,此代码是在MVC框架中执行的,在控制器中执行操作之前,输入验证在中心位置完成。

    您可以从PECL svn扩展使用(或和命令行svn-实际上没有太大区别)


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

    我不需要它是最新的默认设置。我希望我的网站可以在任何时候更新到任何版本,并且只在我需要的时候更新。您正在将用户输入直接传递到PHP命令行!您的脚本不验证用户输入,允许用户在服务器上执行任何命令。@OzairKafray好的,我终于有时间测试了:
    cd c:\data\mysite.com\;svn清理;svn--非交互式--用户名--密码更新-R6
    给我
    系统找不到指定的路径。
    好,我编辑了行。当我在CLI上执行它时,它工作得非常好,但当它作为php脚本在
    test.php
    站点中运行时,它不会给出任何输出,也不会做任何事情。这是目前的情况:@dainisaols如果用户名和密码文件是空的,正如我在所附代码中看到的,请删除--username和--password字符串。我只是在发布之前删除了这些信息:)有一个密码和一个用户名。从您在下面发布的评论中:“我不需要它是最新的。我希望有可能在任何时候更新我的网站,以任何修订,只有当我需要它。“如果是这种情况,那么表单和SVN工作副本应该具有所有相同的权限,因为它们都被Apache用户访问,不是吗?除非您没有为文件设置正确的所有者。1.我不确定是否要使用这样写的内容:“此函数是实验性的。此函数的行为、名称和周围文档可能会在未来的PHP版本中更改,恕不另行通知。使用此函数的风险由您自行承担。”。正如我已经说过的,权限设置为
    Everyone
    w/full-access.@DainisAbols:我使用SVN:PHP没有任何问题。如果我下次更新PHP时需要做一些细微的更改(通常一年一次或两次),我可以接受。我不会在生产中使用它,但我无法想象为什么我会从生产代码中调用SVN。至于权限,向每个人授予所有权限并没有那么好(这是不安全的,如果使用工作副本进行提交,可能会弄乱SVN中存储的权限标志),因此我试图解释如何做得更好。当然,这只有在你解决了最初的问题后才有意义。
    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;
        }
    }