【问题标题】:Best practice for managing project variants in Git?在 Git 中管理项目变体的最佳实践?
【发布时间】:2010-11-08 05:29:50
【问题描述】:

我必须开发两个 Django 项目,它们共享 90% 的相同代码,但在多个应用程序、模板和模型本身中存在一些差异。

我正在使用 Git 进行分布式源代码控制。

我的要求是:

  • 两个项目的公共代码在一个地方开发(Project1 的开发环境)

  • 定期将其合并到第二个项目(Project2)的开发环境中

  • 变体不容易封装在应用程序中。 (例如,有一些应用程序。例如“配置文件”在 Project1 和 Project2 之间有所不同,但也有一个持续的共同演变)

  • Project1 和 Project2 都有公共存储库,因此我可以与其他人协作

  • 同样,Project1 和 Project2 应该有开发、演示、登台和生产服务器。

  • 但是,在这两种情况下,公共存储库都不在同一台服务器上。因此,例如,当我在 Project1 中进行开发时,我希望能够“推送”到我的 github 服务器,但没有 Project2 的内容。

  • 有local_settings.py等文件在Project1和Project2之间完全不同,但应该在每个Project的多个开发者之间共享

那么处理这种情况的最佳方法是什么?

看起来比较理想的是“过滤拉取”,而不是 .gitignore 说“完全忽略这个文件”,我可以说“从那个 repo 拉取时忽略这个文件”我什么也看不到很像文档中的内容,但可能有类似的内容吗?

【问题讨论】:

  • 您找到解决方案了吗?想尝试自己做类似的事情吗?
  • 我也在寻找。

标签: django git


【解决方案1】:

您可以使用两个不同的 git 分支进行开发。当您对另一个共同的一个进行更改时,只需 git-cherrypick 它们。您也可以推送和拉取特定的分支,这样任何人都不需要知道您正在同时处理这两个分支。

【讨论】:

    【解决方案2】:

    考虑到它是一个 Django / Pinax 站点,变体分散在几个不同的应用程序中,我不建议使用子模块。

    变体应在 project1 分支和 project2 分支中独立管理,无需“过滤” gitignore 结果。

    如果您确定了一些真正常见的代码,它们可能会出现在第三个 repo 中,然后您可以“子树合并”到 project1 和 project2 存储库(子树合并策略的含义为 illustrated in this SO answer

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      将通用代码移到它自己的库中,并使其成为这两个项目的依赖项。这不是版本控制的问题,而是代码重用、设计和消除重复的问题。

      【讨论】:

      • 您好,Esko。这不是真正的图书馆。这是一个 Django / Pinax 站点。这些变体必然分散在几个不同的应用程序中。将常见的或变化的内容封装在一个地方并不容易。
      • 请给出更详细的例子来说明不同之处。我不熟悉 Django 应用程序。
      • 例如,我们可能有一个用户“个人资料”应用程序,其中个人资料模板位于“/templates/profiles/profile.html”中。我们需要在我们的两个项目中维护这个文件之间的细微差别。但是我们不想将 profile.html 添加到 .gitignore 中,因为这样就不会在该项目中工作的不同开发人员之间共享更改。
      • profile.html 模板包含哪些差异? Django 提供了哪些方法将这些差异抽象到不同的文件中?
      • 重点是模板差异可能取决于每个项目的突发奇想。今天,设计师、客户等可能更喜欢将 Project1 模板分成三个选项卡区域,而 Project2 将它们显示为单个滚动页面。在一个月的时间里,Project2 可能已经采用了选项卡,但使用了不同的 js 小部件库。变化很大。不变的不是模板包含的内容,而是包含的内容。 (并将信息传递给它。)
      【解决方案5】:

      我将创建第三个 repo,我将在其中放置 Projects 共享的代码。然后 Project1 和 Project2 将拥有自己的 repo,他们可以从那个“共享”的第三个 repo 中提取。

      我认为您对“过滤拉动”的想法将难以实现。

      【讨论】:

      • 嗨,Macarse,我想到了一个通用的 repo,但我认为这还不够。 (如,我仍然需要在 Project1 和 Project2 存储库中开发(错误修复),并且希望将常见修复推送回通用存储库。问题是我想部分推回,而不是让 git 认为common repo 已过期。或者这是错误的?
      猜你喜欢
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多