用于多个类似(但不完全相同)部署的版本控制工作流程

时间:2012-08-05 06:45:33

标签: git deployment version-control stylesheet reversion

我目前在一家小型非技术组织工作,并被赋予了编写组织网站的角色。虽然我很享受这项任务,并且已经在网络开发方面学到了很多东西,但我遇到了一些问题,我希望有人可以帮助我,或者至少指出我正确的方向。

一点背景:

我工作的网站有子域,每个子域都有自己独立的WordPress安装 - 因为这是负责更新内容(等)的用户类型最简单的“后端”管理面板。

在组织内部,我在营销经理(MM)下工作,并根据他的风格指南和线框进行编码。

虽然我们从年初开始只使用一个子域,但项目相对简单明了。但是,最近工作流程变得有点复杂,因为我们的原始子域已被复制到其他子域。每个新子域都会对其样式表进行少量编辑(例如,背景图片不同,此处和那里颜色略有不同等)。

问题:

目前管理所有不同的子域名一直是“可以忍受的”,但是现在制造骆驼的那根稻草已经是MM现在已经看到最终产品所需要的轻微转变。我对样式表的逆转问题是,首席执行官将在一周内说他喜欢改变“X”,然后作为MM和我继续修改网站(到现在的“Z”),将在另一周说明他希望我们将“X”更改为“W”,但保留“Y”中的大部分更改。

我正在寻找的东西允许:

  • 跟踪文件更改
  • 恢复所做的更改(或从'e'恢复为'a',但包括更改'b'和'c')
  • 轻松将必要的文件上传到各自的WP主题安装

那里有什么能解决这些问题吗?如果是这样,是什么?

感谢您的帮助!

PS - 我现在正在学习Git,它似乎很好地完成了“跟踪文件更改”。但是,还没有了解到还原变化。也许对于我的最后一点,我正在考虑创建一个shell脚本来自动将文件上传到他们的文件夹。 Git也这样做吗?


附录(alexbbrown)

我遇到了类似的问题:我运行了一个自定义版本的mediawiki,我在版本化的核心中安装了各种扩展(使用svn)。每个扩展都需要confit文件中的一个部分,但confit文件还需要为多个部署中的每个部署进行本地配置。我本可以使用包含它来实现它,但它们不会被版本化;每次重新分支是一件苦差事。在git中获得+50的经验值达到+50。

3 个答案:

答案 0 :(得分:5)

Git会让你做你需要的。

我将使用包含每个子域的单个存储库作为分支,因为根据我的经验,这将允许您以最简单的方式在子域之间移动更改。

我将假设一个结构,其中有一个core分支,以及几个subdomainX个分支,每个分支都有自己的本地更改来维护。我还假设您有一个develop分支,您可以在其中进行核心更改。

您需要执行以下几项关键操作:

您已对所有子域

进行了开发更改

将更改从开发转移到核心

git checkout core
git merge develop

将更改应用于子域分支。对于每个子域运行

git checkout subdomainX
git rebase core

或者如果你更喜欢合并而不是rebase(我觉得这个案子过于混乱 - 但其他人可能不同意)

git checkout subdomainX
git merge core

如果你有很多子域分支,那么我会编写脚本。这会将名称中包含“子域名”的所有本地分支重新绑定到core

for i in $( git branch | cut -b 3- | grep subdomain ) ; do
   git checkout $i
   git rebase core
end

您已对要扩展到所有其他子域的子域进行了更改

首先,您需要要应用的更改的SHA(如果您还没有,请将其签入)。

接下来,您将把这个更改拉入开发分支,然后进入core

git checkout develop
git cherry-pick THE_SHA_OF_YOUR_CHANGE
git checkout core
git merge develop

然后,您只需运行上面的脚本,将更改推送到所有子域分支。

你已经做了一些应该在任何地方撤消的变化

git checkout develop
git revert THE_BAD_SHA
git checkout core
git merge develop

然后运行脚本。

您想要比较两个子域。

如果两个分支被称为subdomainAsubdomainB,则可以执行

git diff subdomainA subdomainB

您想查看subdomainA中的更改,但不是core - 即本地更改。

可以通过以下方式获取对文件的更改:

git diff subdomainA core

的实际变更集列表
git log core..subdomainA

处理分发

有两种方法可以解决这个问题:

  • 制作一个小脚本来复制每个分支的文件(我使用rsync来避免复制现有文件等)。这样做的好处是它很快,并且在您部署的服务器上不需要git。
  • 使每个子域文件成为git存储库的副本。然后,您的脚本将ssh到每个框并拉/合并文件。这样做的一个优点是您可以对实时服务器进行更改,并轻松将其重新导入存储库。缺点包括您需要设置bare存储库作为所有存储库的原点,并且它将占用更多空间。 (然而IMO在这种情况下的优势超过了缺点,我会使用这种方法)。

答案 1 :(得分:1)

Michael的答案很好,但我认为应该提到另一种观点:Branch by Abstraction(BBA)而不是传统的“源代码控制分支”。我认为您应该重新组织您的源代码,以便共享代码应该作为显式共享代码而不是通过魔术合并/ rebase共享。

也许值得介绍一些构建脚本,它将重新排列代码并运行一些测试来检查正确性。

答案 2 :(得分:0)

实施git的好主意!它绝对是开发过程中不可或缺的工具。正如您所提到的,git肯定会解决您的“跟踪文件更改”问题,并且还可以解决其他问题,这只是一个学习曲线。关于git有很多很好的资源,但是如果你想更好地了解git是什么(以及它是什么)以及它是如何工作的,我建议你阅读Git from the bottom up

使用git可以非常轻松地恢复更改。首先,您可能需要查看提交历史记录以找到您想要恢复的提交历史记录。这可以通过使用git log命令来完成(确保您在git跟踪的目录中)。有关here的更多信息。一旦您知道要恢复的提交,您需要做的就是利用与该特定提交关联的哈希并运行git reset --hard 6e3e02050a,其中6e3e02050a是您的提交的唯一哈希。更多信息,包括您可以使用的一些很酷的事情,here。这将立即将所有跟踪文件还原为特定提交(您也可以还原单个文件)。

信不信由你,git还可以帮助您在需要时自动将代码推送到服务器。这是一个更高级的,并利用post-receive hook。这有助于从开发到生产站点的部署。正如我所指出的那样,这是更高级的,所以我不会在这里详细说明,但有一个很棒的教程,包括你想要的wp.tutsplus.com(具体步骤4)。

现在所有这些事情对于单个安装来说都很容易,但是当你有许多网站都连接到同一个开发过程时,它会变得有点复杂。同样,git有一些选择。

我猜你在这一点上可能会对branching有所了解,如果没有lots of resources的话。分支允许您从主“主”分支拍摄探索性甚至完全独立的项目。听起来这正是您想要的所有不同的安装,这些安装都基于相同的主代码。分支的另一个好处是,您可以使用主服务器的任何更改使您的分支机构保持最新,并且如果您愿意,可以将它们合并回来。另一种选择是克隆。这与您实际上是复制和整个存储库的事实不同,而不仅仅是分支您当前拥有的内容。关于here的更多信息。

可能需要一段时间来确定设置所有内容的最佳方法,但我可以保证,一旦你有某种程序,你就会对git可以给你的选择和安心感到非常满意。