我们正在使用 svn 开发大型 Web 应用程序,并且我们会定期更新生产环境。生产服务器无权访问 svn(出于安全原因)。
自上次生产版本以来,将更改推送到新版本的最佳方式是什么?我们希望避免每次都重新创建整个站点,因为它非常大。
我们正在使用 svn 开发大型 Web 应用程序,并且我们会定期更新生产环境。生产服务器无权访问 svn(出于安全原因)。
自上次生产版本以来,将更改推送到新版本的最佳方式是什么?我们希望避免每次都重新创建整个站点,因为它非常大。
好吧,让我试一试。您可以解析 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 收到来自服务器的冲突更改。来自服务器的更改直接与您自己对文件的更改重叠。不过,不必惊慌。这种重叠需要由人(你)解决;我们将在本章后面讨论这种情况。
或者,如果您更喜欢半手动解决方案,您可以使用WinMerge或Araxis Merge等差异工具来同步两个目录。
编辑:
我不认为“svn update”会完全起作用,但我决定的是:
我编写了一个脚本来捕获“开关”的输出。它将 U 和 A 操作转换为“添加”到 zip 存档。它将 D 操作转换为要在生产服务器上执行的删除命令。在生产服务器上,我们只需要解压缩存档并运行删除命令。
对玻璃墙一侧的目录进行结帐,使其可从生产服务器访问。使用某种 diff/sync 实用程序来同步两者,减去 _svn 文件夹或任何其他会污染生产环境的文件。
或者使用带有“自 mm/dd/yyyy 以来的更改”的文件的 zip(或其他存档),并将其应用于生产目录。