PHP、Subversion和克隆,然后提交目录结构

PHP、Subversion和克隆,然后提交目录结构,php,svn,commit,Php,Svn,Commit,我有一个有趣的问题,我希望有人能帮我解决。我有一个subversion存储库,用于存储大型PHP站点的源代码。以下是有关我的设置的一些重要细节: 站点的开发版本位于服务器上的/var/www/sitename-dev,它是通过从存储库执行svn签出而创建的 该站点的实时版本位于/var/www/sitename,并且也是通过svn checkout创建的 存储库上设置了一个提交后钩子,每次提交后将在开发人员站点上运行svn更新,如果提交日志条目包含特殊的部署关键字,则在活动站点上运行svn更新

我有一个有趣的问题,我希望有人能帮我解决。我有一个subversion存储库,用于存储大型PHP站点的源代码。以下是有关我的设置的一些重要细节:

  • 站点的开发版本位于服务器上的/var/www/sitename-dev,它是通过从存储库执行svn签出而创建的
  • 该站点的实时版本位于/var/www/sitename,并且也是通过svn checkout创建的
  • 存储库上设置了一个提交后钩子,每次提交后将在开发人员站点上运行svn更新,如果提交日志条目包含特殊的部署关键字,则在活动站点上运行svn更新
  • 所有这些都非常有效,大大提高了我的团队的工作效率
该网站的目的是提供一套许多公司需要的核心功能,并让购买我们产品的每个公司都有自己的专门品牌网站来提供我们的功能。这是通过使用Smarty模板引擎实现的(非常好)。每个品牌站点共享相同的核心文件(因此,修复核心文件中的错误会修复每个站点的错误),并且具有位于/resources/site中的模板目录结构。需要/resources/site中的每个文件,但内容因站点而异

我希望能够在站点的administrator部分创建一个表单,该表单将创建一个新的品牌站点,作为现有默认站点的/resources/site目录的克隆(在/var/www的本地副本中),并将其添加到subversion存储库(add/commit)。这将允许我们在下一次svn更新后立即开始重做模板

以下是我到目前为止的情况:

public function addNewSiteHandle($handleName){
    try{
        $resourceRoot = "/var/www/site";
        echo "Resource Root = ".$resourceRoot."<br />";
        $resourceRoot .= "/resources";
        echo "Resource Root = ".$resourceRoot."<br />";
        $this->recursiveCopy($resourceRoot."/rtx", $resourceRoot."/".$handleName);
        $files = array();
        foreach(scandir($resourceRoot."/".$handleName) as $file){
            if($file != "." && $file != ".." && $file != ".svn"){
                echo "Processing \"$file\"<br />";
                svn_add($resourceRoot."/".$handleName."/".$file, true, true);
                array_push($files, $resourceRoot."/".$handleName."/".$file);
            }
        }
        svn_commit("Handle \"$handleName\" added through the Website.", $files);
    }
    catch(Exception $e){
        error_log($e->getMessage());
    }
}
公共函数addNewSiteHandle($handleName){
试一试{
$resourceRoot=“/var/www/site”;
echo“Resource Root=“.$resourceRoot.”
; $resourceRoot.=“/resources”; echo“Resource Root=“.$resourceRoot.”
; $this->recursiveCopy($resourceRoot./rtx“,$resourceRoot./”$handleName); $files=array(); foreach(scandir($resourceRoot./“$handleName)作为$file){ 如果($file!=“&&&$file!=”。“&&&$file!=“.svn”){ 回显“处理\“$file\”
”; svn_add($resourceRoot./“$handleName./”$file,true,true); 数组\u push($files,$resourceRoot./“$handleName./”$file); } } svn_提交(“Handle\”$handleName\“通过网站添加。”,$files); } 捕获(例外$e){ 错误日志($e->getMessage()); } }
这会导致以下错误:

[Wed Aug 15 14:31:01 2012][error][client 192.168.1.x]PHP警告: svn_add():发生svn错误\n155007(路径不是工作副本 目录“/var/www/site/resources/testtt43”不是一个工作目录 复制\n在第76行的/var/www/site/Subversion.class.php中, 推荐人:


我知道该站点是一个工作副本目录,所以我不确定问题出在哪里。有什么想法吗?

您的脚本复制了整个站点目录,包括.svn子目录。
您不应该复制这些.svn目录,也不应该在复制后从复制的目录中递归删除它们。之后,SVN add&commit将正常工作。

脚本将复制整个站点目录,包括.SVN子目录。
您不应该复制这些.svn目录,也不应该在复制后从复制的目录中递归删除它们。之后,SVN add&commit将正常工作。

我相信您是正确的。我使用regex.*\.svn.*在我的复制函数中过滤掉所有与subversion相关的文件,并且我只在svn中添加了/resources/site目录(带有递归标志),这似乎很有帮助。我相信你是对的。我使用regex.*\.svn.*在我的复制函数中过滤掉所有与subversion相关的文件,并且我还只向svn添加了/resources/site目录(带有递归标志),这似乎很有帮助。