网站版本控制实践

网站版本控制实践

我尝试搜索,但无法真正找到最佳搜索词来找到答案。

我有一台装有 Apache 的 Ubuntu 10.04 服务器。我想建立一个有版本控制的站点,因此我的文件结构将如下所示:

/var/www/MyApp1.0
/var/www/MyApp1.1
/var/www/dev -> /var/www/html/MyApp1.1
/var/www/test -> /var/www/html/MyApp1.0

其中“dev”和“test”是指向其他文件夹的符号链接。因此,这两个环境的 URL 将是“http://my-url.com/dev“ 或者 ”http://my-url.com/test“。对于我的生产环境,我希望浏览器中的 URL 只是“http://my-url.com“,而不会重定向到类似“http://my-url.com/prod“。

我该如何设置它以便基本 URL 指向特定版本而无需重定向改变 URL?

谢谢,

特拉维斯


编辑:

我觉得我应该更详细地介绍我们当前的设置,并让大家知道我们没有太多时间进行大量更改。请原谅篇幅太长,但我试图准确描述我们当前的设置,以便获得最佳解决方案。

我们的开发团队由 9 人组成,其中 5 人负责我们的主要项目 (C++),3 人负责我们主要项目的艺术设计,而我则负责所有网页设计以补充我们的主要项目。我们使用 MS SourceSafe 进行版本控制。我知道很多人对它有意见,但我们已经使用了一段时间,目前不打算改变它,因为我们有太多其他优先事项。

开发团队的每个成员(包括我自己)都在 Windows 工作站上工作。我们的任何本地机器上都没有安装 Apache。在我开始在这里工作之前,他们已经设置了一台安装了 Apache 的 Ubuntu Linux 服务器来托管网站。他们会在该 Linux 服务器上的开发区进行开发,每当他们要创建新的 Web 版本时,他们都会将文件复制到本地机器,然后从那里将其签入 SourceSafe。

自从我来到这里,我就在 Linux 服务器上设置了一个 Samba 共享,并将其映射到我的 Windows 工作站上的网络驱动器。这样,我就可以签出和签入文件,而无需将它们复制到我的本地机器上。由于我现在是唯一一个从事网络工作的人,所以我一直将文件签出,并编写了一个批处理脚本来执行“构建”过程。每当我想用新版本更新我们的测试环境时,我都会运行批处理脚本,它会执行以下操作:

  • 创建一个新文件夹来包含新网站版本
  • 将文件从开发环境复制到新文件夹
  • 更新“测试”链接以指向新文件夹
  • 将项目签入SourceSafe,保持文件签出
  • 使用我进行更改时更新的文本变更日志中的注释来标记项目

因此,我们确实有一个版本控制系统,虽然它可能不是最好的,但对我们来说很管用。我想我可以停止创建版本文件夹和使用符号链接,但我有点喜欢通过简单快速地更新符号链接来轻松切换不同版本的能力。

我真的很感激这些答案让我知道了实际的最佳实践是什么(我现在意识到我没有为这个问题起一个好的标题)。我发现这些信息非常有用,作为一个只真正独自工作过或在一个小团队中工作过的人,我以前并不知道这些信息,并将在未来的努力中遵循这些做法。

但是,为了节省时间和方便,有没有一个好的方法可以让我保留当前设置,而只需将基本 URL 重定向到其他文件夹而不更改 URL?本质上,我会将 /var/www 设为指向 MyApp1.0 的符号链接,但我遇到的问题是,我将无法再访问 /var/www/dev 或 /var/www/test。

再次感谢,

特拉维斯

答案1

我不会使用符号链接来做这件事;我会用 mod_rewrite 来做所有事情。

RewriteEngine on
RewriteRule /dev/(.*) /var/www/MyApp1.1/$1 [L]
RewriteRule /test/(.*) /var/www/MyApp1.0/$1 [L]
RewriteRule /(.*) /var/www/MyApp0.9/$1 [L]

答案2

这里的最佳实践是使用修订控制系统(如 subversion、mercurial 或 git)来处理版本。

该过程是您在任何地方设置一个主存储库或根存储库(它可能在 Web 服务器上,也可能在其他地方)。要更改您的网站,请从存储库中签出代码,在本地计算机上进行修改和测试,然后在您满意时(甚至在此之前 - 这就是版本控制的美妙之处)将更改提交或合并回存储库。

然后,您在 Apache 中设置两个站点 - 不多也不少。一个站点是并且永远是您当前的实时生产站点。另一个是并且永远是您的 QA/Staging/预生产站点。当您有新的更改集想要上线时,您首先从存储库签出/更新/合并相应修订号的更改到 QA 区域,然后重新测试那里的所有内容,以确保它的外观和工作符合预期。假设一切正常,您现在可以对您的实时站点执行相同的操作。

这样,您就不必在每次更新网站时设置一组新链接或文件夹,并且可以与大多数常用的网络开发工具配合使用。它还可以更好地跟踪您的历史记录。

答案3

无论如何,我不确定 Apache 安装是否允许您从符号链接提供页面。我知道我的不会。

答案4

@Ignacio Vazquez-Abrams:

您的答案看起来像我的解决方案,但我不得不对其进行一些修改,并且我需要一些额外的帮助。我的 .htaccess 文件(位于 /var/www/LicenseManager,这是我的域的根目录)如下所示:

Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /
RewriteRule dev(.*) /var/www/LicenseManager/LicenseManager1.02/$1 [L]
RewriteRule test(.*) /var/www/LicenseManager/LicenseManager1.02/$1 [L]
RewriteRule ^$ /var/www/LicenseManager/LicenseManager1.02/$1 [L]

我对此有几个问题。这样设置后,如果我的 URL 为“http://my-url.com/dev/",但如果我的 URL 是“http://my-url.com/dev“(没有尾随斜杠),那么我的包含文件就找不到(CSS 和 JavaScript 文件)。我对正则表达式不是很熟悉,所以也许只是修复这些问题的问题。

另外,我必须用我的例子中的第四行替换你例子中的第四行,否则我会收到内部服务器错误。更改后,它适用于“http://my-url.com“ 或者 ”http://my-url.com/“,但无论哪种情况,我的包含文件仍然存在问题。

那么我该如何更改我的 .htaccess 文件以便找到带有或不带有尾随斜杠的包含文件?

再次感谢!

特拉维斯



PS 我知道这不应该像论坛一样工作,我应该在别人的帖子上发表评论作为答案,但我的问题在评论框中阅读起来会困难得多,没有格式。另外,我太啰嗦了,无法在评论框中写下我需要的所有内容。


编辑:

解决了!这是我的最终 .htaccess 文件的样子:

Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /
RewriteRule ^dev$ dev/ [R]
RewriteRule ^test$ test/ [R]
RewriteRule ^dev/(.*) /var/www/LicenseManager/LicenseManager1.02/$1 [L]
RewriteRule ^test/(.*) /var/www/LicenseManager/LicenseManager1.02/$1 [L]
RewriteRule ^(src/(.*)|$) /var/www/LicenseManager/LicenseManager1.02/$1 [L]

我不得不稍微修改一下正则表达式,因为按照原来的方式,只要在任何地方找到“dev”或“test”,它们就会匹配,所以“http://my-url.com/garbage/blahdevblah.html“将被重定向至”http://my-url.com/dev/“。插入符号 (^) 确保“dev”只能出现在开头,美元符号 ($) 确保“dev”后面没有其他内容。我更改了其他符号,以确保类似“http://my-url.com/garbagedev/nothing.html“不符合规则。

对于最后一条规则,我意识到如果正则表达式只是 (.*),它就会匹配任何内容,因此即使在重定向之后,它仍然会匹配并尝试再次重定向,从而导致无限循环,最终向您显示 500 内部服务器错误。“src”文件夹是我项目中的唯一目录,index.php 是主文件夹中的唯一脚本(省略时会自动显示 index.php)。因此,最后一条规则基本上说“如果字符串以“src/”开头或为空,则重定向。”

再次感谢您的帮助,伊格纳西奥!

相关内容