在网络托管包上进行SVn结帐/更新的最佳方式

时间:2008-10-14 22:11:36

标签: svn deployment

我想通过subversion进行结帐,在我的网络托管包上部署我的网站。我没有SSH访问我的托管包,这只是一个基本的LAMP网络托管包,但我知道在Web服务器上安装了一个SVN客户端。

我正在考虑编写一些可以执行不同功能的脚本(PHP或Shell)。像结帐,更新,切换到另一个标签等,我可以通过某种方式外部打电话。

非常感谢任何有关最佳做法,需要注意的事项以及如何处理此事的意见。

  

更新:我一直在使用   以下技术过去   几个星期了。我小心翼翼   制作(并经过良好测试)一对夫妇   我可以执行的shell脚本   cron通过cPanel。每当有cron的时候   完成了一份工作,它会给我发电子邮件   控制台输出的作业。这样我   可以监视所有命令是否成功。因为我只   在服务器上做更新,没有   承诺,我没有碰到任何   有关Subversion的问题。当然,在我的.htaccess中   文件我创建了一个拒绝的规则   任何访问隐藏的.svn文件夹。

2 个答案:

答案 0 :(得分:3)

我会毫不犹豫地使用Subversion在您的网络主机上管理您的网站,除非您有shell访问权限。执行Subversion操作时,可能会有一些需要您通过脚本界面无法提供的交互式注意事项。

我建议的是维护一个镜像远程目录的本地结帐目录。当您想要对您的实际网站进行更改时,请在本地结帐时执行svn更新,使其看起来与您想要的完全一致,然后使用您喜欢的镜像工具(rsync或其他内容)推送网站到你的网络主机。

或者,您可以将Web主机切换到您具有shell访问权限的主机。我使用Git以这种方式管理一些网站,效果非常好。

答案 1 :(得分:2)

好消息是svn很容易编写脚本,但坏消息是你很可能在没有shell访问的情况下度过难关。

如果您在没有shell访问的情况下执行此操作,请注意可以更改svn下目录中的文件的任何内容。这可能会导致工作副本和最新版本之间发生冲突并阻止您的更新。您可能希望在更新脚本中构建一个还原命令,并在更新之前以递归方式还原。

另一种选择是出口而不是退房。你不会有.svn目录,你也不必担心文件冲突。您可能希望导出到干净的目录而不是覆盖,因为我认为svn导出不会触及非版本化文件,包括通过svn删除的文件。

困难的部分是Web服务器的用户标识可能没有您想要使用结帐命中的目录的写权限。因此,它需要以另一个用户身份运行svn命令以获取写权限和文件所有权。我使用suid-perl来改变有效的uid / gid,并从php调用那些perl脚本。然后Perl使用正确的标识调用svn命令。如果你确实需要suid,那么你需要能够更改文件权限并设置suid位。也许你的FTP可以设置suid权限,否则你需要一个shell。想到的唯一另一个选择(这是一个坏主意)是授予Web服务器对整个目录的写访问权。

如果svn存储库位于单独的计算机上,您可能希望使用svn + ssh。这可能意味着在Web服务器上存储密钥文件或密码。确保密钥文件的权限是正确的,因为如果ssh对所有者以外的任何人都可读,则拒绝它们。为了安全起见,请确保在subversion服务器上登录只能访问svn存储库。

在.htaccess文件或httpd.conf中,您应该阻止任何人访问.svn目录。

我还将PHP更新程序页面保存在受SSL密码保护的目录中。它只能执行一个操作,即将Web目录从svn更新为最新版本。它不接受用户输入。如果它允许用户选择标记或修订版,它只接受列表中的标记选择或整数修订版号。这些将在使用前进行高度清理,并且不会在shell命令或选项中使用任何用户输入。

当您有任何PHP或外部可访问的脚本执行修改服务器上数据的命令时,最重要的是要小心安全性。

我认为在您无法访问shell的计算机上,您将在权限和文件所有权方面遇到很多困难。除非您与此托管服务提供商密切相关,否则我建议您升级到提供工具的提供商,以便让您的工作更轻松。你会节省足够的时间,这可能物有所值。