好消息是 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 访问权限的机器上,您将在权限和文件所有权方面遇到很多困难。除非您与该托管服务提供商密切相关,否则我建议您升级到提供工具以简化您的工作的提供商。您将为自己节省足够的时间,这可能是物有所值的。