Svn 如何保持Subversion与远程服务器(通过FTP)同步?

Svn 如何保持Subversion与远程服务器(通过FTP)同步?,svn,deployment,ftp,continuous-integration,Svn,Deployment,Ftp,Continuous Integration,我们很难保持Subversion和FTP的同步。有时我们忘记提交更改,只是将它们推送到web服务器,我们的web服务器上分散着.svn文件夹,有些东西在一个地方存在,而在另一个地方不存在,等等 今天我想花点时间来解决这个问题。解决办法是什么?有没有一种方法可以将SVN链接到我们的web服务器,这样我们就可以通过FTP提交到存储库和web服务器?我们是否应该向我们的web主机请求一些其他系统,以便更好地与SVN存储库同步?我们如何强制存储库和web服务器同步?如何删除.svn文件夹 正如标题所说,

我们很难保持Subversion和FTP的同步。有时我们忘记提交更改,只是将它们推送到web服务器,我们的web服务器上分散着.svn文件夹,有些东西在一个地方存在,而在另一个地方不存在,等等

今天我想花点时间来解决这个问题。解决办法是什么?有没有一种方法可以将SVN链接到我们的web服务器,这样我们就可以通过FTP提交到存储库和web服务器?我们是否应该向我们的web主机请求一些其他系统,以便更好地与SVN存储库同步?我们如何强制存储库和web服务器同步?如何删除.svn文件夹

正如标题所说,我们如何保持SVN存储库和web服务器同步?

设置一个更新FTP并专门使用SVN进行更改的服务器。这样,当提交更改时,您的web服务器将被更新


这假定web服务器是一个临时服务器。有关详细信息,请参阅注释。

我在服务器上所做的是在服务器上签出代码

因此,我不使用ftp将内容推送到服务器,而是登录到服务器并运行
svn up
。通过以这种方式手动执行此操作,您可以获得一些好处,包括在出现错误代码时回滚的能力

我还建议使用db迁移系统(假设您使用的是数据库)。这将允许您轻松回滚db模式更改,以确保代码在回滚事件中继续工作

将这些与类似于或的工具相结合,将为您提供一个非常健壮和强大的部署系统

关于DVCS的注意事项:

这里的一些人提到了使用一个。其中一些最流行的例子是和(还有其他几个)

这两种方法的使用模式都不同于svn,但这并不直接适用于这个问题。您可以获得的最大好处是,如果您为每次推送到live server进行标记,那么与svn的传统标记模式相比,这样做的成本是微乎其微的

如果您希望使用这两种方法中的任何一种方法到期,那么这两种方法都分别为和提供免费的存储库托管


尽管如此,我还是大力支持使用dvcs,我个人的偏好是。

这看起来像是为分布式版本控制系统量身定做的问题。

您不希望在没有任何形式的测试的情况下将更改提交到live web服务器,是吗

简短回答:通过执行新签出(最好是在中央服务器上)并仅复制运行应用程序所需的位

我建议您进行设置,其中构建服务器负责从Subversion存储库检索最新的源代码,执行构建并为各种环境准备部署包(测试/暂存)一旦您对测试或登台环境中部署的更改感到满意,就有可能将其上传到生产箱


这是确保必须进行更改的唯一可靠方法(我知道这很简单,但在您的场景中似乎是不确定的),否则它们就不会在部署中结束。它强制执行良好的发布管理过程,不要忘记,您可以向构建服务器添加各种其他精彩的自动化内容,如单元测试和功能测试。

我发现最好的方法是确保没有未提交的内容可以泄漏到服务器上-这是一个必须首先修复的漏洞


然后,设置存储库中要同步的部分的本地签出,并使用rsync将数据推送到服务器(在这种情况下FTP实际上没有那么有用)。rsync允许您排除文件和目录,因此请使用该功能确保.svn目录不会同步。

我建议在下面的实现之前,您使用一个测试环境,在该环境中可以直接使用FTP,然后推送live,提交该版本的文件并允许运行此任务

发件人:

这一直都在进行,通过向存储库中添加提交后钩子脚本可以轻松完成。阅读本书第5章中的钩子脚本。基本思想是使“live站点”只是一个普通的工作副本,然后让您的提交后钩子脚本在其上运行“svn update”

实际上,有几件事需要注意。执行提交的服务器程序(svnserve或apache)与运行提交后钩子脚本的程序相同。这意味着此程序必须具有适当的权限才能更新工作副本。换句话说,工作副本必须由运行svnserve或apache的同一用户拥有——或者至少工作副本必须设置适当的权限

如果服务器需要更新它不拥有的工作副本(例如,用户joe的~/public\u html/area),一种技术是创建一个+s二进制程序来运行更新,因为Unix不允许脚本运行+s。编译一个微型C程序:

#包括
#包括
#包括
内部主(空)
{
execl(“/usr/local/bin/svn”、“svn”、“update”、“/home/joe/public\u html/”,
(常量字符*)空);
返回(退出失败);
}
。。。然后chmod+s二进制文件,并确保它是由用户“joe”拥有的。然后在post-commit钩子中,添加一行来运行二进制文件

如果在让钩子工作时遇到问题,请参阅“为什么我的存储库钩子不工作?”

此外,您可能希望阻止apache导出实时工作副本中的.svn/目录。将此添加到httpd.conf:

#禁止浏览Subversion工作副本管理目录。
命令拒绝,允许
全盘否定
完全满足您的需求。试试看。它是SVN与FTP的结合。
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
    execl("/usr/local/bin/svn", "svn", "update", "/home/joe/public_html/",
    (const char *) NULL);
    return(EXIT_FAILURE);
}
# Disallow browsing of Subversion working copy administrative dirs.
<DirectoryMatch "^/.*/\.svn/">
    Order deny,allow
    Deny from all
</DirectoryMatch>