问题 一个项目,多个客户使用git?


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

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

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

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

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

另外,有什么方法可以阻止某些文件合并到主文件中? (但已提交给客户部门)。例如,id喜欢将一些客户数据保存到客户分支,但阻止将其提交给主服务器。

.gitignore文件是否特定于分支?

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

菊。


3133
2017-09-16 00:18


起源



答案:


除了cpharmston的答案之外,听起来你需要进行一些重构来分离出每个客户真正定制的东西,以及什么不是。然后,您可以考虑添加其他存储库来跟踪每个客户端的自定义(全新的存储库,而不是分支)。然后,您的部署可以从主仓库中提取“核心”,并从该仓库中提取客户特定的内容。


6
2017-09-16 00:46



好吧;今天我一直在考虑分离事物,但这并不容易,因为项目已经非常庞大。所以你建议有一个主要的核心存储库,里面有客户特定的存储库(你建议使用git子模块吗?)。 github伪叉怎么样? - jujule
git子模块可能有效(我没有使用它们)。但是你想要它设置,这样当你检查你的客户仓库时,它会检查主要仓库,而不是相反。 - Matthew Talbert
@MatthewTalbert感谢您的出色答复。在上面的评论中,您的意思是当您签出客户仓库时,您可以使用挂钩来检查基础仓库吗?或者它应该是某种部署脚本,它会一个接一个地检查repos并合并代码? - happyhardik


答案:


除了cpharmston的答案之外,听起来你需要进行一些重构来分离出每个客户真正定制的东西,以及什么不是。然后,您可以考虑添加其他存储库来跟踪每个客户端的自定义(全新的存储库,而不是分支)。然后,您的部署可以从主仓库中提取“核心”,并从该仓库中提取客户特定的内容。


6
2017-09-16 00:46



好吧;今天我一直在考虑分离事物,但这并不容易,因为项目已经非常庞大。所以你建议有一个主要的核心存储库,里面有客户特定的存储库(你建议使用git子模块吗?)。 github伪叉怎么样? - jujule
git子模块可能有效(我没有使用它们)。但是你想要它设置,这样当你检查你的客户仓库时,它会检查主要仓库,而不是相反。 - Matthew Talbert
@MatthewTalbert感谢您的出色答复。在上面的评论中,您的意思是当您签出客户仓库时,您可以使用挂钩来检查基础仓库吗?或者它应该是某种部署脚本,它会一个接一个地检查repos并合并代码? - happyhardik


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

在源代码管理中,分支旨在用于要合并回主干的内容。例如, 亚历克斯盖纳 花了他的 夏天的代码 在Django的一个分支上工作 允许支持多个数据库,目标是最终将它合并回Django主干。

结帐(或 克隆,在Git的情况下)可能更适合你想要做的事情。您将创建一个包含所有项目基本文件(和.sample文件,如果愿意)的repo,并将repo克隆到您希望部署代码的所有不同位置。然后在每次部署时手动创建配置和自定义文件(注意不要  他们到回购)。每当您更新仓库中的代码时,运行一个  在每个部署上更新代码。中提琴!


6
2017-09-16 00:37



这实际上意味着他们最终会得到许多不受版本控制的关键文件。 - innaM
感谢名单;这个设置的唯一问题是我的客户特定文件不会保存在git中。而且我对此并不满意。 - jujule
您可以轻松配置它,以便客户特定的文件位于源代码管理下的单独文件夹中。或者你可以备份它们,你知道,软盘;)
想象一下,我的主项目文件夹中有'data'和'settings'文件夹。如果每个客户在这些文件夹中都有不同的文件,则无法在CVS下管理这些文件。当然我有备份但是为此目的使用git会非常棒。 - jujule


马修塔尔伯特是正确的,你真的需要将自定义的东西与非自定义的东西分开。如果您可以重构要包含在一个目录中的所有核心代码,则客户端可以将其用作只读git子模块。额外的好处是您可以将它们锁定到核心代码的显式版本中。这意味着他们必须有意识地更新到更新的版本,这是您想要的生产代码。


1
2017-09-16 00:50



我的项目是基于django的,因此共享根文件夹,其中包含不同的文件和文件夹。有些是客户特定的,有些则不是。我必须在子模块上发表文章! - jujule
请记住,Django不需要“共享根文件夹”或项目目录。只要你有一个设置文件,一个根URLconf,你的应用程序都可以在Python的sys.path上的某个地方导入,你可以根据自己的喜好构建一些东西。拥有一个“核心”项目目录和一个完全独立的客户端自定义目录并不难。 - Carl Meyer


其他答案是正确的,您将处于最佳维护状态,以便将核心代码与自定义每客户端代码分开。但是,我会脱离人群并说如果你不能这样做(比如因为你需要为某个客户端的核心代码添加额外的功能),DVCS分支机构可以正常工作你想做什么。虽然为了这个目的,我可能会推荐每个目录的分支而不是in-repo分支(git也可以执行每个目录的分支,但它只不过是一个克隆的repo,它会发散)。

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


1
2017-09-16 13:30



感谢您分享您的不同POV。如何在django项目中处理客户特定代码?自定义应用程序是您的mercurial中的每个目录分支?生病也需要一些时间来重组整个项目结构 - jujule
好吧,每个Django项目都是针对特定的客户端。我在可重用的应用程序中尽可能多地使用了功能,我可以将它用于许多不同的项目,只有特定于客户端的东西才会出现在实际的项目回购中。 - Carl Meyer


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


0
2017-09-17 08:09