使用Git与Magento的最佳实践是什么?

18

我正在研究如何在我的自有代码库中与供应商的库(在这种情况下是Magento)进行最佳集成。对我来说,我不需要向供应商提交补丁(尽管这将是一个很好的附加优势)。

我已经研究了git submodule和git subtree,但我认为git submodule并不能满足我的需求。Magento具有以下类型的树形结构:

/app
  /code
     /community *
     /core
     /local *
  /design
     /adminhtml
     /frontend
        /base
        /yourtheme *
/lib
  /Zend
  /Varien
  /yourlib *
/js
  /yourjs *
  /varien
  /mage

在使用 git submodule 时,将其放在不同的文件夹中似乎效果最佳(例如,/ 是您的应用程序,/ vendor / magento 是子模块)。然而,在这种程度上相互交织的情况下,子模块似乎不是一个好的解决方案。那么,我对此是否有误解?

那么,我只能选择使用 git subtree。但是对于 git subtree,同样的核心假设(即供应商分支作为子树)并不成立。Magento 不是子树,而是我的项目所适合的核心库。是吗?

如果这两种 git 的方法都不起作用,我应该了解哪些其他方法才能实现我想要的目标?

最后一个选项我不太愿意追求,那就是拥有一个仓库,然后将其应用到最新的供应商更改上(从 tarball 中获取)。我不愿追求这个选项,因为我感觉获得供应商的日志信息(来自https://github.com/magentomirror/magento-mirror)将极大地帮助我整理新的更新并找出影响我的变更。


这是一篇关于完美的Magento/git工作流程的有用博客文章:http://www.dhmedia.com.au/blog/perfect-magento-workflow-using-git - Sam Becker
5个回答

3

你提到的那些方法对我来说都没有起作用...

目前,我正在使用pear来安装和管理核心和社区模块的升级,并使用以下.gitignore文件将整个Magento结构提交到git存储库中:

# Dynamic data that doesn't need to be in the repo
/var/*
/media/*
/downloader/pearlib/cache/*
/downloader/pearlib/download/*
/app/etc/use_cache.ser
local.xml

使用以下shell命令来保留空目录:

for i in $(find . -type d -regex ``./[^.].*'' -empty); do touch $i"/.gitignore"; done;

我想到另一个点子,可以尝试使用供应商分支模型,但我担心它会增加额外的麻烦,特别是在某些大型依赖树的情况下。为了实现真正的效率,必须在pear级别上进行集成,即每个下载的模块必须自动分支。因此,目前似乎只适用于付费扩展。

我曾经在Magento论坛上发布过这个主题,但也没有收到任何回复:http://www.magentocommerce.com/boards/viewthread/78976/

更新:

Magento Composer Installer - 值得一看。

Composer 成为 PHP 的标准依赖管理工具,因此,在项目中使用它将带来更多优势。

您无需提交或分支扩展、主题、库到您的项目树中,但始终具有适当的版本和依赖关系。

谢谢。


3

太好了,看起来正是我想要的。谢谢! - acorncom

2

类似拼布的工作流程

这正是之前使用 quilt 完成的工作,现在你可以使用 Stacked Git(基于 Git)、Mercurial Queues(基于 Hg)或者 Loom(基于 Bazaar)完成同样的工作。

这个想法是维护一系列叠加在一起的补丁,这些补丁适用于 SCM 版本控制的文件(可能也会创建新文件,这种情况适用于您)。随时可以弹出整个堆栈、更新上游代码,然后逐个重新堆叠所有补丁。如果它们都能够干净地应用,那么就会自动完成,否则该过程将在第一个有问题的补丁处停止。

Pure Git

以下内容假定您正在克隆 Magento 的 Git 存储库。如果他们不使用 Git,您仍然可以通过首先使用 tailor 将其历史记录转换为 Git 进行操作。

变基

Git 通过 变基 让从不同起点重新应用历史的一部分变得容易。因此,您也可以仅仅克隆 Magento,编写您的代码,并在更新 Magento 时从最后一个干净的 Magento 修订版本开始进行,然后将您的工作变基到新的干净的 Magento 修订版本上。

您基本上使用普通的 Git 工具遵循 Quilt 的工作流程。

分支

另一种方法是简单地使用分支。您可以克隆 Magento 的存储库,从中创建分支,进行自己的操作,当您获取 Magento 的最新修订版本时,合并两个分支即可。这只是典型的 DVCS 工作流程,假设您是一个 Magento 开发人员,正在开发一个永远不会进入主分支的功能分支...


1

我认为你们在谈论不同的事情。

Yauhen的建议是完全正确的。您可以在git中完成所有这些操作,而且不需要子模块或子树。

我的.gitignore文件与您大致相同,看起来很好。

我写了一篇关于我们如何使用git作为团队管理Magento商店的文章,也许对您有用:

Magento部署的最佳实践


1

你的问题更多涉及 git 的子模块与子树合并。我想不到任何会影响比较的具体 Magento 相关内容。你可能已经了解 子树合并策略,我建议使用该策略,但我不确定你为什么需要首先进行合并。

最佳实践是避免合并,Magento 架构足够灵活以允许此操作。请遵循以下简单规则:

  1. 避免修补供应商代码。
  2. 如果无法避免,请在执行修补之前,考虑将更改打包到自定义 Magento 模块中,并将其放置在 app/code/local 下。

如果您的修改涉及 PHP 代码:

  1. 利用面向对象编程 (OOP),最小化对某些方法的更改。扩展相应的类。
  2. 使用 Magento 配置机制在 config.xml 中覆盖相应的类。
  3. 如果无法实现前两者,请将更改(修补后的类)放入 app/code/local 中,即位于 include_path 顺序更高的位置,以便有效地使用您的代码而不是供应商的代码。

如果您的修改涉及phtml模板 -> 使用Magento布局机制将供应商的phtml替换为您自己的。适当的设计定制将需要大量的修改活动和布局工作。

如果您的修改涉及JS -> 同样,使用布局来链接放置在js或皮肤文件夹中的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接