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

问题描述 投票:6回答:10

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

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

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

svn deployment ftp continuous-integration
10个回答
6
投票

我在服务器上做的是检查服务器上的代码。

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

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

将这些与类似于FabricCapistrano的工具相结合,将为您提供一个非常强大且功能强大的部署系统。

关于DVCS的注意事项:

这里的一些人提到使用distributed vcs。其中一些最受欢迎的例子是gitmercurial(还有其他几个)。

这两者的使用模式都不同于svn,但这并不直接适用于这个问题。你可以获得的最大收益是,如果你为每次推送到实时服务器做标签,那么与传统的svn标签模式相比,这样做的成本微乎其微。

如果你希望与GitHubBitBucket中的任何一个过期,它们分别为gitmercurial提供免费存储库托管。

话虽这么说,我是使用dvcs的巨大支持者,我的个人偏好是mercurial


-2
投票

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


8
投票

您不希望在没有任何形式的测试的情况下对实时Web服务器进行更改,是吗?

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

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

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


5
投票

Springloops完全符合您的要求。搏一搏。这是SVN与FTP的结合。您处理本地工作副本,然后将更改提交到存储库,然后通过Springloops将选定的修订版本通过FTP部署到任何服务器(暂存或生产)。


2
投票

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

来自tigris

这是一直进行的,并且可以通过向存储库添加post-commit钩子脚本来轻松完成。阅读本书第5章中的钩子脚本。基本的想法是使“实时站点”只是一个普通的工作副本,然后让你的post-commit钩子脚本运行'svn update'。

在实践中,有几点需要注意。执行提交的服务器程序(svnserve或apache)与将运行提交后挂钩脚本的程序相同。这意味着该程序必须具有更新工作副本的适当权限。换句话说,工作副本必须由svnserve或apache运行的同一用户拥有 - 或者至少工作副本必须具有适当的权限集。

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

#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);
}

...然后chmod + s二进制文件,并确保它由用户'joe'拥有。然后在post-commit钩子中,添加一行来运行二进制文件。

如果您在使用钩子时遇到问题,请参阅“为什么我的存储库挂钩无效?”。

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

# Disallow browsing of Subversion working copy administrative dirs.
<DirectoryMatch "^/.*/\.svn/">
    Order deny,allow
    Deny from all
</DirectoryMatch>

1
投票

尝试http://svn2ftp.com - 没有任何项目管理批量,您只需设置SVN存储库,它将在每次提交时自动同步到任意数量的S / FTP帐户。


0
投票

设置更新FTP的post-commit hook并专门使用SVN进行更改。这样,当提交更改时,您的Web服务器将会更新。

这假设Web服务器是登台服务器。请参阅评论了解详情


0
投票

我发现这样做的最好方法是确保没有任何未提交的内容可以逃逸到服务器 - 这是你必须首先解决的漏洞。

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


0
投票

当我向下滚动并看到克里斯的建议时,我正打算建议Springloops。我在过去的几个月里一直在使用SpringLoops并且非常喜欢它。

您可以为每个存储库设置staging和prod服务器的FTP详细信息。然后,您可以通过FTP发布到这些服务器,指定要部署的修订号。

我真正喜欢的是我可以通过Springloops中的部署页面查看每个服务器的版本。通过Springloops部署所有内容,您知道这是准确的。

我实际上一直在寻找一个不仅仅是一个SVN存储库的解决方案..具有集成的票务,维基和计时的东西。我很喜欢Bitbucket,但它没有Springloops的FTP部署功能,不幸的是它为我排除了它。现在我将坚持使用Springloops,直到另一个服务可以提供FTP部署。

为什么FTP部署对我来说如此重要?我听到有些人在他们的呼吸下咕...道。我很乐意告诉你:我部署到各种不同的服务器。一些是专用的盒子,一些云托管的VM,以及一些共享托管。我不想为每个人维护一个单独的部署方法,因此所有人共同的部署方法是FTP。 Springloops非常适合我的源代码和我的服务器。这就是为什么 :)


0
投票

该站点向您展示如何配置Subversion以完全满足您的需求。 http://www.itforeveryone.co.uk/svn2web.html

© www.soinside.com 2019 - 2024. All rights reserved.