7

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

一点背景:

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

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

虽然自今年年初以来我们只使用一个子域,但该项目相对简单明了。然而,最近工作流程变得有点复杂,因为我们的原始子域已被复制到其他子域。每个新的子域都会对其样式表进行细微的修改(例如,不同的背景图片,这里和那里的颜色略有不同等)。

问题:

目前管理所有不同的子域是“可以忍受的”,但目前压住骆驼的最后一根稻草是 MM 需要的轻微恢复,因为 CEO 已经看到了最终产品。我在样式表中遇到的问题是 CEO 会在一周内声明他喜欢更改“X”,然后作为 MM 和我继续修改网站(现在是“Z”),另一周会声明他希望我们将“X”更改为“W”,但保留“Y”中所做的大部分更改。

我正在寻找的是允许:

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

有什么东西可以解决这些问题吗?如果是这样,是什么?

谢谢你的帮助!

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


附录(alexbbrown)

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

4

3 回答 3

5

Git会让你做你需要的。

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

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

您需要执行几个关键操作:

您已在开发中进行了更改,该更改应适用于所有子域

将更改从开发拉到核心

git checkout core
git merge develop

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

git checkout subdomainX
git rebase core

或者如果您更喜欢合并而不是变基(我发现这种情况变得过于混乱 - 但其他人可能不同意)

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 在这种情况下的优势大于劣势,我将使用这种方法)。
于 2012-08-30T05:56:15.000 回答
1

Michael 的回答很好,但我认为还有一个观点值得一提:Branch by Abstraction (BBA) 而不是传统的“Branch by Source Control”。我认为你应该重新组织你的源代码,以便共享代码应该作为显式共享代码而不是通过魔法合并/变基共享。

也许值得引入某种构建脚本来重新排列代码并运行一些测试来检查正确性。

于 2012-09-03T15:36:35.047 回答
0

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

使用 git 可以很容易地恢复更改。首先,您可能需要查看您的提交历史以找到您想要恢复的提交。这可以通过使用git log命令简单地完成(确保您在 git 跟踪的目录中)。这里有更多关于这方面的信息。一旦您知道要恢复到的提交,您需要做的就是利用与该特定提交关联的哈希并git reset --hard 6e3e02050a6e3e02050a您的提交的唯一哈希处运行。更多信息,包括你可以用它做的一些很酷的事情,在这里。这将立即将您跟踪的所有文件恢复到该特定提交(您也可以恢复单个文件)。

信不信由你,git 还可以帮助您在需要时自动将代码推送到服务器。这有点高级,并利用了post-receive hook. 这有助于从开发到生产站点的部署。正如我所提到的,这是更高级的,所以我不会在这里详细介绍,但是有一个很棒的教程,其中包含您在wp.tutsplus.com上想要的内容(特别是第 4 步)。

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

我猜在这一点上你可能知道一点branching,如果没有的话,那里有很多资源。分支允许您从主要的“主”分支开始探索甚至完全独立的项目。对于所有基于相同主代码的不同安装,这听起来正是您想要的。分支的另一个好处是,您可以使您的分支与主分支的任何更改保持同步,并在需要时将它们合并回来。另一种选择是克隆。这是不同的,因为您实际上是在复制整个存储库,而不仅仅是从您当前拥有的内容中分支出来。更多信息在这里

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

于 2012-08-30T04:34:27.393 回答