我如何用git制作存储库的层次结构



我有一个带有以下层次结构的项目:

Tharwa
|_tharwa-backend
|_tharwa-web
|_tharwa-mobile 

每个都是子文件夹,这本身就是一个存储库;我想创建将所有内容整合在一起的存储库Tharwa。

我有以下约束:

  • 我不想将它们与子文件夹放在相同的回购中,因为每个人都有其自己的依赖关系和配置文件,而且我也不想将其提交混合在一起。

  • 我不想将它们作为单独的存储库留下例如,在同一分支上解决的问题:

    __________________________ master
     ________________________ develop
           ______/ login
    

我的问题是,如何使这样的事情成为可能?我在哪里错了?

,如果我没有很好的解释,请告诉我。预先感谢

基本上有3种观看方法:

  1. 一个带有3个目录的存储库,一个每个项目
  2. 一个存储库,可能几乎是空的,带有3个git subsodules(每个存储库(每个存储库(自己是一个存储库,但与主库绑在一起(
  3. (
  4. 三个完全独立的存储库

我不知道您的约束"我不想混合他们的承诺"。来自,也许只是因为您还不知道Git太多。只需注意,现在您拥有git中的PowerFool工具和选项,可以查看提交,按日期,作者,路径,内容等过滤。因此,我认为这不必担心。相比时间是API的生产者和消费者,这仅在一个提交中反映(

但是,如果您想要严格的提交隔离,则在选项3中都有它。

至于您的第二个约束,在选项1中可以立即使用,在2中可能可以,但肯定不是3。

git subsodules应该自己进行讨论,因为它们会受到自己的约束。在大规模使用之前,请确保阅读和了解它们。除了官方文档(第一个链接(

以外,这是一些有趣的链接
  • https://git-scm.com/book/en/v2/git-tools-submodules
  • https://github.com/blog/2104-working-with-submodules(请参阅有关是否使用子模块的建议,最后(
  • https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407(关于子模型与子树的讨论,基本上是选项2 vs 1(
  • (
  • https://www.atlassian.com/blog/git/git/git-submodules-workflows-tips(带有subsodules的工作流程上的一些提示(
  • https://www.atlassian.com/blog/git/git/git-submodules-workflows-tips(subsodules and Branches(
  • https://codingkillthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-shouldnt-shouldnt-git-submodules/(一些反对他们的论点(

至于您在子模型和分支上的特定问题,请查看此问题及其答案:git subsodules:指定分支/标签

就像我在评论中写的那样,事情也取决于您如何打包和分发此软件。是总是按原样部署的一件代码(选项1和2将更有意义(,还是可以与其他项目分开发布一个项目(选项3将更有意义(。请注意,我说的是"更有意义",因为它不是黑白,您总是可以以任何选择来实现目标,妥协只是不同的。

这也取决于开发人员的舰队,这些开发人员将在这些方面进行。他们与git的知识水平是多少?我不是建议初学者推荐的子模型。以及如何在远程存储库之间推出/拉动提交?在选项1中,您有一个存储库可以满足,在选项2中也需要更新子模型(请参阅文档(,在选项3中,您有3个单独的存储库可以处理。

也可能有其他侧点需要考虑,但是如果您从空内容开始,它们可能是无关紧要的。像大小一样。一些存储库有时可能包含很多历史记录,例如,这会影响git clone(在这种情况下,如果一个人很大,则具有单独的存储库,这不会影响其他存储库(。

您似乎暗示了http://nvie.com/posts/a-successful-git-branching-model/上所述的工作流程,这是一个很好的开始。如果您想坚持下去,它在选项1中很容易,大部分是可能的,但在2中不可能,而在3中则不可能。(并查看https://www.atlassian.com/git/tutorials/comparing-workflows for其他一些可能的工作流程(

在我看来,您的两个约束在相反的方向上,因此您需要查看哪个比另一个更重要。

至于我自己,但是没有您的整个图片,我会喜欢选项1,因为它似乎是最灵活的一个(从中您可以轻松地切换到选项2或3(。

我不想将它们与子文件夹放在相同的回购中,因为每个人都有自己的依赖性和配置文件,而且我也不想将其提交混合在一起。

好吧,您不希望他们的提交混合。

我不想将它们作为单独的存储库留下该问题在同一分支上解决...

...除非您希望他们的承诺混合在一起。;(

我在哪里弄错了?

如果您必须同时习惯性地更改多个存储库,则可能需要考虑它们是否实际上是一个存储库。有两种好方法来处理此问题,子重新构件不是其中之一。


一个repo

一个是使它们成为一个存储库。如果它们都是同一项目的部分,并且它们的变化相互取决于彼此,则它们是一个存储库。他们可以成为具有自己的配置和依赖性的子文件夹,这对于需要一起开发但要分配的大型项目很常见。

缺点是开发人员可能会利用这一点,并将客户端代码紧密地绑定到后端。没有项目之间的明确分离,后端API可能会变得草率。客户更有可能利用无证件的后端功能,使整个系统变得脆弱且具有抗性。添加一个新客户,例如tharwa-api,将变得更加困难。

如果您有第三方为tharwa-backend编写自己的客户,则他们处于不利地位。clientweb处于特权位置,可以使用backend锁定。第三方开发人员并不那么幸运,您的项目将很难为

做出贡献。

,一旦您一起携带项目,您就不太可能再次将它们拉开。


许多存储库,严格的依赖性。

另一种是通过将每个回购视为正常依赖性,更严格地强制执行您在零件之间的封装。在您的login示例中...

  • 实施,测试和提交backend上的更改。
  • 发布backend,即使仅用于内部分布。
  • 针对新的backend测试webmobile,以确保保持向后兼容性。
  • 某些依赖机制允许直接从git回购中绘制依赖性。
  • webmobile更新其backend依赖关系并使用新功能。

现在,开发人员更难作弊。释放的额外步骤(不应花费一两分钟以上(提供了"气隙"。backend必须开发自己的单位,集成和接受测试;它不能依靠客户为他们做。客户必须更加强大,并更严格地遵守后端API。随着后端和客户端的脱钩,对每个的 internals 进行根本性更改会更容易。

开发人员仍然可以更改锁定,但现在显式。使他们明确劝阻他们的使用,可以防止开发人员变得懒惰。

,但它确实增加了更多的开销。backend必须充分考虑,开发和记录。backend API必须更充分发达和健壮。客户必须更紧密地遵守API。所有这些都是很好的软件工程,并将在长期和长期中加快速度。


为什么不subsodules?

子模块提供了单个存储库的大部分优势,但添加了一个令人困惑的功能。它还提供了单个仓库不利的全部,再加上一个:缺乏协调。

有了一个回购,一个提交是一个提交。一个分支是一个分支。使用子模型,很难通过查看必须在所有存储库之间协调的单个存储库来知道。这些协调的提交可以随时发生,而无需警告,这很难知道。

您需要一些过程和机制来跟踪和协调这些提交。您可以通过反复试验自己构建所有这些,也许是带有标签或特殊提交消息的东西。

或者您可以使用现有的释放依赖系统。


您选择的取决于项目。但是,我建议您尝试完整的脱钩,看看它如何进行。它鼓励良好的软件工程实践。您总是可以稍后将它们放回原处,很难相反。

最新更新