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

Posted

技术标签:

【中文标题】在网络托管包上进行 SVn 结帐/更新的最佳方式【英文标题】:Best way of doing an SVn checkout/update on a web hosting package 【发布时间】:2008-10-14 22:11:36 【问题描述】:

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

我正在考虑编写某种可以执行不同功能的脚本(php 或 Shell)。比如结账、更新、切换到另一个标签等,我可以以某种方式从外部调用。

非常感谢您对最佳实践、需要注意的事项以及如何进行这方面的任何意见。

更新:我一直在使用 追随过去的技术 现在几周。我已经仔细 精心制作(并经过良好测试)一对 我可以从中执行的 shell 脚本 cron 通过 cPanel。每当 cron 有 完成了一项工作,它会给我发电子邮件 作业的控制台输出。这样我 可以监控所有命令是否成功。由于我只 在服务器上进行更新,没有 提交,我没有遇到任何 关于颠覆的问题。当然,在我的 .htaccess 文件我创建了一个将拒绝的规则 对隐藏的 .svn 文件夹的任何访问。

【问题讨论】:

【参考方案1】:

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

我可能建议改为维护一个本地结帐目录,以反映您的远程目录。当您想更改您的实时站点时,请在本地结帐时执行 svn update,使其看起来完全符合您的要求,然后使用您最喜欢的镜像工具(rsync 或其他东西)将站点推送到您的网络主机。

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

【讨论】:

【参考方案2】:

好消息是 svn 很容易编写脚本,但坏消息是如果没有 shell 访问权限,您可能会遇到困难。

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

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

困难的部分是 Web 服务器的用户 ID 可能没有对您想要在结帐时点击的目录的写入权限。因此它需要以另一个用户身份运行 svn 命令以获得写入权限和文件所有权。我使用 suid-perl 更改有效的 uid/gid,并从 php.ini 调用这些 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 访问权限的机器上,您将在权限和文件所有权方面遇到很多困难。除非您与该托管服务提供商密切相关,否则我建议您升级到提供工具以简化您的工作的提供商。您将为自己节省足够的时间,这可能是物有所值的。

【讨论】:

以上是关于在网络托管包上进行 SVn 结帐/更新的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

在 C# Web api 上进行用户身份验证的最佳实践是啥?

在 Mac OS X 上进行进程间通信的最佳方式

在单独的线程上进行 iPhone CoreLocation 调用的最佳方法?

Woocommerce 通过 ajax 在结帐时更新运输方式

SVN 如何查看第一次结帐的变化?

SVN 从存储库中删除更改,但将它们保留在我的结帐中?