多个开发人员/编辑人员正在一个网站上工作


28

背景

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

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

我的问题是:

有没有一种简单的方法可以自动合并数据库,以便多个人可以进行WordPress安装?我当然可以,只是出口我的表知道我的本地机器上已经改变,他们推到临时服务器,但它可能也有临时服务器上的东西,我想搞垮。我可以获取两个DB的SQL输出并将它们进行比较...但是,这似乎很乏味和骇人。我想知道这是否是其他人已经解决的问题;如果有一种社区认可的方式来处理这种事情。

谢谢!


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

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

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

2
@John P Bloch-我认为这在这里是一个很好的问题,这是有原因的。我目前没有时间回答,但希望其他人也可以。
MikeSchinkel 2011年

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

Answers:


16

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

吉特的一切

即使我问了这个问题,我也正在做这件事,但是指出这一点是很好的。使用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文件。其中每一个都以类似的名称存储在Git中wp-config-gavin.php,当我们要使用该配置时,我们将其符号链接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后端中进行更改,然后必须在生产中再次进行这些更改。但是,我们发现这种事情很少见,并且此过程对我们来说效果很好。


1

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


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

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

用法: ./script.sh development-dump.sql > production-dump.sql

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

2
注意:sed无法处理先前已序列化的mysql转储中编码的数据。
哈克(Hakre)2011年

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

1

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

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.