【问题标题】:PHP Subversion Setup FTPPHP Subversion 设置 FTP
【发布时间】:2009-05-23 01:07:10
【问题描述】:

我在一家小型 php 商店工作,最近我提议我们不再使用 nas 作为共享代码库,而是开始使用 subversion 进行源代码控制。

我已经想出了如何确保我们的开发服务器在每次提交到我们的开发分支时都得到更新......而且我知道如何合并到主干并更新我们的登台服务器,因为我们可以直接访问两者其中,但我最大的问题是如何编写一个脚本来更新生产服务器,我们很多时候只能通过 ftp 访问。我不想每次都上传整个网站......有没有办法编写一个足够聪明的脚本,以便在我们执行它时只将更改的内容上传到网络服务器(不希望它自动成为上传到生产环境,我们要手动执行)?

我的问题还有意义吗?

【问题讨论】:

    标签: php svn ftp


    【解决方案1】:

    基本上,您的问题是您不能在生产服务器上使用颠覆。您需要做的是在单独的(理想情况下配置相同的)服务器上保留生产结帐的副本,并通过任何方法将其复制到生产服务器。实际上,您可以将其视为您的暂存服务器,因为它还有助于在发布之前对版本进行最终测试。

    就副本而言,如果您的提供商支持rsync,那么您已经准备就绪。如果您只有 FTP,则必须找到某种方法来通过 FTP 进行 rsync 等效。这不是第一次有人有这种需要。网络搜索将为您提供帮助。但是,如果您找不到任何东西,请给我留言,我会进一步环顾四周。

    编辑:希望作者不介意我添加这个,但我认为它属于这里。要使用 ftp 执行类似于 rsync 的操作,请查看 weex http://weex.sourceforge.net/。它是命令行 ftp 的包装器,它使用本地镜像来跟踪远程服务器上的内容,以便它只能发送更改的文件。非常适合我。

    【讨论】:

    • 特别感谢您的编辑...我一直在寻找可以与 subversion 一起使用的东西,但我想我只需要通过 ftp 同步的东西...好点,谢谢!
    • 本,很高兴你添加了这个。
    【解决方案2】:

    doesn't sound like SVN 与 FTP 配合得很好,但如果您有 http 访问权限,这可能足以证明使用 svnsync 推送更改。这就是我们将更改推送到生产服务器的方式——我们使用 svnsync 来保持存储库的只读镜像可用。

    【讨论】:

    • 如果服务器没有运行 subversion 怎么办?
    【解决方案3】:

    我使用以下解决方案。只需在您的网络服务器上安装 SVN 客户端,并将其附加到一个可私人访问的 url:

     <?php
    
        // make sure you have a robot account that can't commit ;) 
        $username = Settings::Load()->Get('svn', 'username');
        $password = Settings::Load()->Get('svn', 'password');
        $repos = Settings::Load()->Get('svn', 'repository');
    
        echo '<h1>updating from svn</h1><pre>';
        // for secutity, define an array of folders that you do want to be synced from svn. The rest should be skipped.
        $svnfolders = array(    'includes/' ,'plugins/' ,'images/' ,'templates/', 'index.php' => 'index.php');
    
        if(!empty($_GET['justthisone']) && array_search($_GET['justthisone'], $svnfolders) !== false){ // you can also just update one of above by passing it to $_GET
            $svnfiles = array($_GET['justthisone']);
        }
    
        foreach($svnfiles as $targetlocation)
        {   
            echo system("svn export --username={$username} --password {$password} {$repos}{$targetlocation} ".dirname(__FILE__)."/../{$targetlocation} --force");
        }
    
        die("</pre><h1>Done!</h1>");
    

    【讨论】:

      【解决方案4】:

      我将在这里做一个假设,并说您正在使用提交后挂钩来合并/更新您的登台服务器。这可能有效,但我强烈建议您查看Continuous Integration 解决方案。以下是我知道的一些:

      1. Xinc - http://code.google.com/p/xinc/(特定于 PHP)
      2. CruiseControl - http://cruisecontrol.sourceforge.net/(广受欢迎。) 通过http://phpundercontrol.org/about.html 实现 PHP 集成
      3. Hudson - [https://hudson.dev.java.net/](似乎基于 Java,但允许插件/扩展)

      【讨论】:

      • 与我设置的提交后工具相比,使用其中一种工具有什么好处?
      【解决方案5】:

      LFTP 能够通过 ftp 同步目录。

      【讨论】:

        【解决方案6】:

        只是一个想法:

        您可以在您有权访问且安装了 subversion 的主机上保存项目的修订版。这个单一修订反映了生产服务器的版本。 您现在可以编写一个 PHP 脚本,通过 svn 更新此存储库,然后查找自 rep 更新以来已更改的所有文件。您可以上传这些文件。

        这样的脚本可能如下所示:

        $path = realpath( '/path/to/production/mirror' );
        chdir( $path );
        
        $start = time();
        shell_exec( 'svn co' );
        
        $list = array();
        $i = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ), RecursiveIteratorIterator::SELF_FIRST );
        
        foreach( $i as $node )
        {
        
            if ( $node->isFile() && $node->getCTime() > $start )
            {
        
                $list[] = $node->getPathname();
        
            } 
        
            // directories should also be handled
        
        }
        
        $conn = ftp_connect( ... );
        
        // and so on
        

        正如我想到的那样。

        【讨论】:

        • 如果我找不到可以自动完成的东西,那就太好了!非常感谢!
        【解决方案7】:

        我想这会对你有所帮助

        https://github.com/midhundevasia/deploy

        它在 Windows 中运行良好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多