1

我们正在使用 svn 开发大型 Web 应用程序,并且我们会定期更新生产环境。生产服务器无权访问 svn(出于安全原因)。

自上次生产版本以来,将更改推送到新版本的最佳方式是什么?我们希望避免每次都重新创建整个站点,因为它非常大。

4

2 回答 2

1

好吧,让我试一试。您可以解析 SVN 更新命令输出并生成仅复制已更改文件的复制指令吗?

http://svnbook.red-bean.com/en/1.1/ch03s05.html

让我们进一步检查 svn update 的输出。当服务器将更改发送到您的工作副本时,每个项目旁边都会显示一个字母代码,让您知道 Subversion 执行了哪些操作来更新您的工作副本:

U foo

文件 foo 已更新(从服务器收到更改)。

A foo

文件或目录 foo 已添加到您的工作副本中。

D foo

文件或目录 foo 已从您的工作副本中删除。

R foo

文件或目录 foo 在您的工作副本中被替换;即 foo 被删除,并添加了一个同名的新项目。虽然它们可能具有相同的名称,但存储库将它们视为具有不同历史的不同对象。

G foo

文件 foo 从存储库收到了新的更改,但您的文件的本地副本有您的修改。要么更改没有相交,要么更改与您的本地修改完全相同,因此 Subversion 已成功地将存储库的更改合并到文件中而没有问题。

C foo

文件 foo 收到来自服务器的冲突更改。来自服务器的更改直接与您自己对文件的更改重叠。不过,不必惊慌。这种重叠需要由人(你)解决;我们将在本章后面讨论这种情况。

或者,如果您更喜欢半手动解决方案,您可以使用WinMergeAraxis Merge等差异工具来同步两个目录。

编辑:

我不认为“svn update”会完全起作用,但我决定的是:

  • 当前(旧)产品版本的svn结帐
  • svn切换到为 prod 准备的版本(新)

我编写了一个脚本来捕获“开关”的输出。它将 U 和 A 操作转换为“添加”到 zip 存档。它将 D 操作转换为要在生产服务器上执行的删除命令。在生产服务器上,我们只需要解压缩存档并运行删除命令。

于 2010-05-26T20:22:52.617 回答
0

对玻璃墙一侧的目录进行结帐,使其可从生产服务器访问。使用某种 diff/sync 实用程序来同步两者,减去 _svn 文件夹或任何其他会污染生产环境的文件。

或者使用带有“自 mm/dd/yyyy 以来的更改”的文件的 zip(或其他存档),并将其应用于生产目录。

于 2010-05-26T20:22:37.643 回答