背景

我正在建设第一个相当大的WordPress网站的最后阶段,现在遇到了一些磨擦。在大多数情况下,该站点是在我的本地计算机上开发的,我会将更改推送到登台服务器上进行审查(有关更多背景,请参阅此问题)。我最终得到的解决方案在仅编辑内容时效果很好,但是现在其他人正在编辑内容,而我仍然需要添加功能。这个想法是:如果功能和内容可以并在一起,我们可以更快地完成工作...但是现在我不确定。

当前数据库中存在不同的内容暂存服务器,而不是本地计算机上。本身就很好,因为我不需要本地计算机上的最终主体副本,但是我需要做更多的开发工作,这会影响数据库(安装/编写更多需要各自表的插件)。

我的问题是:

是否有一种简单的方法来自动化数据库的合并,以便多个人可以进行WordPress安装?当然,我可以只导出我知道在本地计算机上更改过的表,然后将它们推送到登台服务器,但是有可能我想关闭登台服务器上的某些内容。我可以获取两个DB的SQL输出并将它们进行比较...但是,这似乎很乏味和骇人。我想知道这是否是其他人已经解决的问题;如果有一种社区认可的方式来处理这种事情。

谢谢!

评论

投票决定关闭或转移到另一个站点(Jan:对一个好的站点有何想法?也许是超级用户)。这不是特定于WordPress的,因为在此情况下,您会在Drupal,Joomla或任何PHP + MySQL驱动的网站上遇到相同的问题。

话虽如此,我的建议是您使用远程登台服务器而不是本地的。

@John P Bloch:有了Drupal,像Drush这样的东西在这种情况下会大有帮助。我个人习惯使用Django,其中的固定装置可以缓解这些问题。另外,我目前有两台登台服务器:一台本地服务器和一台远程服务器。问题是我在远程计算机上工作,但是需要将其推送到服务器,以便其他人可以看到它。最终的服务器将在我们将所有内容放在一起时设置。

@John P Bloch-我认为这是有道理的。我目前没有时间回答,但希望其他人也可以。

@加文:对不起,我误解了你的问题。是的,我相信这会覆盖生产服务器上的所有内容。 :/

#1 楼

一年多以前,我曾问过这个问题,在那段时间里,我们为团队增加了更多人,并在WordPress中开发了更多的网站。我想逐步了解我们的过程,以防它可能对其他人有帮助。

Git中的所有内容

即使我问这个问题,我也在做这件事,但这很好指出这一点。使用Git不仅帮助我们提高了工作效率,而且还多次节省了我们的集体资产。

您是否曾经需要对站点进行大型结构翻新,并获得客户的批准,同时对未更新的版本进行较小的更新?我们有,Git让我们做到这一点。描述此设置可能会花费很多时间,但是基础知识是我们创建了一个新分支,将该分支拉到服务器上,并将子域附加到该分支。

我们还由Git保存。当然,它允许我们回滚更改,这很棒,但是也允许我们带回旧版本的文件。这意味着,如果客户问:“还记得一年前网站的这一部分是如何工作的吗?我们可以把它带回来吗?”,答案是肯定的,即使被问询的人不在该项目上也没有。

除了这些要点之外,这还意味着我们永远不会缺少需要的文件。我们总是可以从任何计算机上下载该站点的最新版本并开始进行更改。

使用Git部署

我们在Media Temple上进行WordPress托管,非常喜欢他们。他们不是最便宜的提供商,但是他们的服务非常出色,并且服务器的设置确实很好。默认情况下,也提供Git。这意味着我们可以将服务器设置为Git存储库,并以这种方式提取更改,而不是使用SFTP。这也意味着在服务器上进行工作不存在被覆盖的危险(因为这些更改可以合并并推回)。

因为我们使用BitBucket作为我们的Git主机,所以这里需要做一些额外的工作。首先,我们使用.ssh / config文件,以便我们可以键入ssh sitename之类的内容登录到服务器(我们还使用无密码的SSH,这使超级简单)。我们还确保始终使用ssh密码短语(Mac OS X通过允许您将密码短语存储在Keychain.app中使此操作非常容易)。最后,在要从中提取主机的.ssh / config条目中添加ForwardAgent行。这意味着我们只需要BitBucket中每个人的SSH公钥,而无需每个服务器的公钥。我们还要确保将.git目录保留在公共HTML目录之上的一个目录。

自动数据库转储

一旦服务器处于生产模式,我们确保自动返回我们的数据库,以防万一。

每个人都有自己的wp-config

,因为我们都有自己的本地数据库用户名和密码,并且因为我们可以使用不同的名称和服务机制,我们每个人都有自己的wp-config文件。其中的每一个都以wp-config-gavin.php之类的名称存储在Git中,当我们要使用该配置时,我们将其符号链接到wp-config.php(Git使用.gitignore会忽略它)。

这也允许我们覆盖siteurl数据库表中的wp_options选项,如下所示:

define('WP_SITEURL', 'http://sitename.localhost');
define('WP_HOME', 'http://sitename.localhost');


这可以防止WordPress从数据库中查找服务器位置,并且这并不奇怪关于本地安装和服务器安装的位置差异。

关于wp-config.php文件的最后一点说明:确保将它们存储在公共HTML目录上方,并使权限仅对Web用户只读。这在保护WordPress方面具有巨大的区别。

数据库问题

最后,问题的关键。

我必须接受的是,在使用WordPress时,没有“合并”数据库更改的好方法。相反,我们需要制定行为准则来解决这一问题。规则很简单,到目前为止到目前为止对我们都有用。

在开发过程中,只有一个人“拥有”该网站。该人员通常进行设置(将托管包放在一起,启动Basecamp项目,对设计进行切片,诸如此类)。一旦该人达到合理的程度,就转储数据库以进行WordPress安装并将其放入Git。从那时起,进行开发的每个人都使用该数据库转储,并且所有者是唯一对数据库进行更改的人。

一旦站点构建进一步发展,该站点就会被放置一台服务器。从那时起,服务器的数据库是规范的。每个人(包括所有者)都必须在服务器上进行所有数据库更改,并将这些更改拉下来以进行本地开发和测试。

此过程并不完美。仍然有可能有人在开发过程中需要在WordPress后端中进行更改,然后必须在生产中再次进行这些更改。但是,我们发现这种事情很少见,并且此过程对我们来说效果很好。

#2 楼

我正在进行这样的安装,并且之前已经回答过类似的问题。以下是我针对此类工作的首选设置。因为您要合并数据库而不是替换现有数据库,所以我会加一些注意,在执行MySQL转储时不要使用--add-drop-table标志。



步骤1. Mysql转储您的开发数据库
步骤2.将development.domain.com的所有实例替换为production.domain.com ^^
步骤3.登录MySQL,运行SOURCE命令以导入数据,例如source /path/to/file


^^如何用新的替换旧域的所有实例:(1)复制以下脚本。 (2)。 (3)运行。

用法:chmod +x

#!/bin/sed -f
s/'\([^\']*\)development.domain.com\([^\']*\)'/'production.domain.com'/g


评论


注意:sed无法处理先前已序列化的mysql转储中编码的数据。

– hakre
2011-3-22在17:25

实际上,您之前回答的问题是我的:)我觉得我在这里问一个不同的问题。当我只在处理整个数据库时,最好转储整个数据库,但是如果在上述情况下这样做,我将覆盖其他人的更改,或者覆盖我自己的更改。由于多个人在WordPress实例上工作,因此我希望将这些更改结合起来。

–加文·安德列格(Gavin Anderegg)
2011年3月22日在17:33

#3 楼

我现在正在尝试针对同一问题的不同解决方案。这绝对是一个棘手的问题。

我当前的解决方案是使用--skip-extended-insert标志进行本地mysql转储。我相信此标志会导致为数据库的每一行生成一条插入记录语句,从而使转储更加易于合并。我从这篇文章中学到了这个技巧:http://www.viget.com/extend/backup-your-database-in-git/。

然后,我使用Git和站点的源文件对源.sql数据转储文件进行源代码控制。当其他开发人员提取代码更改时,.sql文件将随其一起提供。然后,他将此文件导入到数据库的本地版本中。我们都使用MAMP在两台计算机上以相同的方式设置了各自的本地数据库,因此无需进行任何搜索和替换。

存在合并问题,因此我们尝试对所有可能导致数据库更改的内容采用“轮流”方法。在Wordpress中执行任何会更改数据库的操作之前,请确保他已在最新的转储中签入,拉入并导入,然后要求他在我完成并签入之前不要进行任何数据库更改。这显然不是理想的,我正在寻找更好的解决方案,但这只是一个开始。它还使我们可以很好地控制数据库的版本。

我最终可能会在服务器上建立一个共享的dev数据库,然后尝试将网站的两个本地副本都连接到同一数据库通过SSH隧道传输数据库。但是,无论何时我们中的一个人安装插件时,这种方法都会遇到问题。基本上,PHP文件和MySQL DB将不同步。

我很想听听其他人如何处理这个问题。