我有一个app(cms)结构是这样的:
BASE:
/application/
/public/
themes/
default/
mobile/
这是我们所有项目的基础中央存储库。然后项目得到自己的皮肤:
(基于/default/
主题)
CLONE1:
/application/
/public/
themes/
default/
mobile/
own/
...
own-theme-12/
(此应用有12个基于默认主题的自定义主题。)
整个过程是关于维护应用程序并使所有CLONES与BASE保持同步。
现在,我们将BASE添加为远程仓库:
(/clone1/)$ git remote add base-repo /path/to/base.git
然后在需要时提取更新:
(/clone1/)$ git pull base-repo develop
当修改.php
中的/application
个文件时,一切都很有效。当我们在BASE repo中修改default
主题中的文件时(例如reset.css
中的拼写错误),问题就开始了。我们需要CLONE1/default
主题和所有CLONEx/own-x/
主题中的这些更改。
当然需要一些bash脚本来告诉复制和提交更改的位置,但如何在没有合并冲突的情况下保持整个事物的同步?
我们使用git flow
。 default
和mobile
主题目前不在单独的分支中。我们需要他们吗?我们还没有使用子模块。
有很多方法可以组织这个工作流程,但您会选择哪种方式作为最佳工作流程?
答案 0 :(得分:2)
您可以使用git-subtree来解决此类问题。基本上,您正在做的是基于上游应用程序构建自定义应用程序,并且您的自定义应用程序有两种更改:应用程序修复和特殊主题。您希望获取应用程序修复程序并将其发送到上游,但您不希望向上游发送特殊主题。
如果你在顶层创建了两个子树:一个用于你的上游应用,一个用于你的主题,你可以用git-subtree分割/加入它们。从上游继承的主题可以从app目录符号链接到主题目录。所以你得到这样的东西:
/app/code/*.php
/app/themes/default/
/app/themes/mobile/
/themes/default -> ../app/themes/default
/themes/mobile -> ../app/themes/mobile
/themes/own-1/
当您想要向上游发送应用更改时,您会执行类似
的操作 git subtree split --prefix=app --rejoin
答案 1 :(得分:1)
考虑到应用程序需要这些主题目录才能运行,它们应该保存为目录,而不是分支。
您无法将多个分支部署到生产中(您从一个分支或另一个分支中选择版本,而不是所有分支)。您可以部署多个目录,允许应用程序在不了解SCM的情况下运行。
对于其余部分,以 merge driver 执行的脚本可以:
BASE/default
的内容合并到local/default
reset.css
是否存在于其他目录中,并开始在其上报告相同的演变)。我没有关于确切机制的具体信息,但我怀疑合并驱动程序是传播更改的良好切入点。