【问题标题】:One project, Multiple customers with git?一个项目,多个客户使用 git?
【发布时间】:2010-11-28 15:40:56
【问题描述】:

我是 GIT 新手,还不知道它能满足我的需求,但它看起来令人印象深刻。

我有一个 webapp 用于不同的客户(django+javascript)

我计划使用 GIT 将这些不同的客户版本作为分支来处理。每个客户都可以拥有自定义文件、文件夹和设置、改进版本……但应该共享相同的“核心”。我们是一个小团队,订阅了一个github账号。

分支是处理这种情况的好方法吗?

关于设置文件,您将如何进行?你会 .gitignore 客户特定的设置文件并添加一个 settings.xml.sample 文件,例如 repo 吗?

另外,有什么办法可以防止某些文件被合并到 master 中? (但承诺给客户分支)。比如id喜欢把一些客户数据保存到客户分支,但是又不想提交给master。

.gitignore 文件是特定于分支的吗?

编辑 在阅读了您所有的答案(谢谢!)之后,我决定首先重构我的 django 项目结构,以将核心和我的不同应用程序隔离在应用程序子文件夹中。这样做可以使项目更干净,并且调整 .gitignore 文件可以轻松使用 git 分支来管理不同的客户和设置!

朱。

【问题讨论】:

    标签: django git github


    【解决方案1】:

    我不会使用分支来完成你想要做的事情。

    在源代码管理中,分支旨在用于要合并回主干的事物。例如,Alex Gaynor 将他的 summer of code 用于 Django 的一个分支 allows for support for multiple databases,目的是最终将其合并回 Django 主干。

    Checkouts(或 clones,在 Git 的情况下)可能更适合您尝试做的事情。您将创建一个包含所有项目基础文件(和 .sample 文件,如果您愿意)的存储库,并将该存储库克隆到您希望部署代码的所有不同位置。然后在每次部署时手动创建配置和自定义文件(注意不要将它们add 发送到 repo)。每当您更新存储库中的代码时,请在每个部署上运行 pull 以更新代码。中提琴!

    【讨论】:

    • 这基本上意味着他们最终会得到许多不受版本控制的关键文件。
    • 谢谢;此设置的唯一问题是我的客户特定文件不会保存在 git 中。我对此感觉不太好。
    • 您可以轻松配置它,以便客户特定的文件位于源代码控制下的单独文件夹中。或者您可以将它们备份到软盘上;)
    • 想象一下我的主项目文件夹中有“数据”和“设置”文件夹。如果每个客户在这些文件夹中都有不同的文件,则这些文件无法在 CVS 下进行管理。当然,我有备份,但为此目的使用 git 会非常棒。
    【解决方案2】:

    除了 cpharmston 的回答之外,听起来您需要进行一些重构,以区分出每个客户真正自定义的内容和非自定义内容。然后,您可以考虑添加额外的存储库来跟踪每个客户端的自定义(全新的存储库,而不是分支)。然后,您的部署可以从您的主存储库中提取您的“核心”,并从该存储库中提取特定于客户端的内容。

    【讨论】:

    • 好的,谢谢;今天我将重点放在考虑分离事物上,但这并不容易,因为项目已经很大了。所以你的建议是有一个主要的核心存储库,里面有客户特定的存储库(你建议使用 git 子模块吗?)。 github 的伪分叉呢?
    • git 子模块可能会起作用(我没有使用它们)。但是你希望它设置成当你签出你的客户仓库时,它会签出主仓库,而不是相反。
    • @MatthewTalbert 感谢您的出色回答。在上面的评论中,您的意思是当您签出客户回购时,您也可以使用挂钩来签出基本回购?或者它应该是某种部署脚本,它会一个接一个地检查 repos 并合并代码?
    【解决方案3】:

    Matthew Talbert 是正确的,您确实需要将自定义内容与非自定义内容分开。如果您可以将所有核心代码重构为包含在一个目录中,您的客户可以将其用作只读 git 子模块。额外的好处是您可以将它们锁定在核心代码的显式版本中。这意味着他们必须有意识地更新到较新的版本,这是您想要的生产代码。

    【讨论】:

    • 我的项目是基于 django 的,所以有一个共享的根文件夹,其中包含不同的文件和文件夹。有些是客户特定的,有些则不是。我必须在子模块上做文档!
    • 请记住,Django 不需要“共享根文件夹”或项目目录。只要你有一个设置文件、一个根 URLconf 和你的应用程序都可以在 Python 的 sys.path 的某个地方导入,你就可以按照你喜欢的方式构建东西。拥有一个“核心”项目目录和一个完全独立的用于客户端自定义的目录并不难。
    【解决方案4】:

    其他答案是正确的,只要您将核心代码与自定义的每个客户端代码分开,您将处于最佳维护状态。但是,我会从人群中脱颖而出并说如果您无法做到这一点(例如因为您需要为某个客户端的核心代码添加额外的功能),DVCS 分支可以很好地满足您的需求.虽然我可能会为此目的推荐每个目录分支而不是 repo 分支(git 也可以执行每个目录分支,但它只是一个不同的克隆 repo)。

    我使用 hg,而不是 git,但我所有的 Django 项目都是从具有实用程序脚本、一组基本通用 INSTALLED_APPS 等的同一基本“项目模板”repo 克隆的。这意味着当我对该项目进行更改时模板,我可以轻松地将这些常见更新合并到现有项目中。这与您的计划不完全相同,但相似。如果您修改内核中已为特定客户端定制的相同代码区域,您有时需要处理合并冲突。

    【讨论】:

    • 感谢您分享不同的 POV。您如何处理 django 项目中的客户特定代码?在您的 mercurial 中作为每个目录分支的自定义应用程序?生病还需要一些时间来重组整个项目结构
    • 嗯,每个 Django 项目都是针对特定客户的。我将尽可能多的功能放在可用于许多不同项目的可重用应用程序中,只有特定于客户的东西才会放在实际的项目存储库中。
    【解决方案5】:

    在阅读了您的所有答案(谢谢!)后,我决定首先重构我的 django 项目结构,以将核心应用程序和我的不同应用程序隔离在应用程序子文件夹中。这样做会使项目更干净,并且调整不同分支文件中的 .gitignore 可以轻松使用 git 分支来管理不同的客户和设置!

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 2018-01-12
      • 2014-11-27
      • 1970-01-01
      • 2010-11-20
      • 2023-03-11
      • 2022-10-13
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多