GIT 存储库上的模块化 Java 应用程序

Modular Java Application on GIT repository

我正在开发一个 "modular Java application",它有大约 60 个独立模块,显然都是 "buildable" 独立的。

我试图了解在 GIT 下构建此类应用程序的最佳方法是什么。

我会自己解释得更好:

我已经使用 SVN 工作了几年,在集中式版本控制工具(如 SVN)下构建这样的项目对我来说真的很容易,但我不确定 GIT 最佳实践和 pros/cons.

使用 SVN:

我会导入同一个存储库下的所有项目

我会考虑两种不同的方法,结果相似,例如:

 mod_A
   |___trunk
   |___branches
   |   |___branch_A
   |
   |___tags
 mod_B
   |___trunk
   |___branches
   |   |___branch_A
   |   |___branch_B
   |
   |___tags       

 trunk
   |___mod_a
   |___mod_b
   |___mod_c
 branches
   |___branch_A
   |   |___mod_a
   |___branch_B
       |___mod_a
       |___mod_b

通过这两种方法,我真的很容易获得信息,例如哪些模块为特定功能分支,并从模块预期和分支预期中查看应用程序。

此外,有了这两种结构,我就可以轻松地只对部分模块进行分支,而不用被迫随时对它们进行分支。

与GIT:

目前我正在使用的模块化应用程序的结构是针对任何模块的单个独立存储库,在我看来,这种结构即使带来了一些优势,也有一个真正的大问题。

事实上,我很难对应用程序有一个清晰的整体概览,因为我必须连接到每个存储库并检查分支以了解特定分支中涉及哪些模块,所以如果我'管理我的应用程序的分支版本,例如只涉及 7 个模块要在特定 BUG_FIXING 或 FEATURE 分支中分支,而不是整个应用程序,我无法通过 GIT,我应该以自定义方式管理这些信息。

那么即使应用程序会在同一个 repo 中设置,我也无法决定只分支模块的一个子集,因为 "Git operates on the entire repository, not on individual directories"。

能否请您说明模块化应用程序遵循的最佳方法,GIT 子模块是否可以作为解决方案?有没有其他我没有考虑的方法,或者我正在从错误的假设中走出来?

非常感谢!

首先,您应该在 一个 git 存储库 中管理模块 Java 应用程序,就像在一个 SVN 存储库中管理一样,因为所有模块都适用于同一个项目。

对于您的应用程序的分支模块结构,我建议在单独的分支(modX)中管理每个模块,并在master分支[=中管理您的整个项目77=].

工作流程可以是:

  • 管理 master 分支中的项目级文件。主分支的结构为:

    Root (master branch)
       |___... (project level files)
    
  • 从 master 检出模块分支(例如 modA 分支、modB 分支和 modC 分支)。删除项目级文件并在 mod_X 文件夹中添加模块文件。

    比如分支modA,结构为:

    Root (modA branch)
       |___mod_A (folder)
               |___... (module A level files)
    
  • 完成模块 X 的工作后,将 modX 分支合并到 master 分支。

  • 所有模块完成工作后(并合并到master),master分支的文件结构应该是:

    Root (master branch)
       |___... (project level files)
       |___mod_A (folder)
               |___... (module A level files)
       |___mod_B (folder)
               |___... (module B level files)
       |___mod_C (folder)
               |___... (module C level files)
    
  • 如果您在 modX 分支中更新模块 X,然后将 modX 分支再次合并到 master 分支以确保应用程序已更新。

  • 要维护项目级(应用程序聚合器)文件,您还可以在 developfeaturehotfix 分支上 develop/test/fixbug:

    1. master 分支作为您的 java 应用程序的生产版本。
    2. develop 分支(应该从 master 分支签出的长期存在的分支)用于所有开发人员。当更改的应用程序构建成功(已验证)时,您可以将 develop 分支合并到 master.
    3. feature树枝是短命树枝。如果您需要为您的应用程序开发新功能,您可以从 develop 分支签出一个功能分支。然后功能完成,将功能分支合并到 develop 分支以验证您的代码。
    4. hotfix 树枝也是短命树枝。您可以在分支上修复错误,当错误被修复时,将 hotfix 分支合并到 develop 分支。

    还有 a successful branching model 您可以参考管理项目级(应用程序聚合器)文件。

旁白:不要使用分支来管理不同的模块。分支将是短暂的,并在准备好发布时最终合并回 master。


如果模块 "change/release" 放在一起,您可以倾向于将它们放在一个存储库中。尽管每个模块在 SVN 中都有自己的 trunk/branches 文件夹这一事实似乎表明它们是单独更改的。

如果您在 java 应用程序中使用 maven,它可以作为一个多模块项目在一个存储库中设置。

如果您使用单独的回购协议,您可以类似地命名您的分支机构(添加票号或类似 feature/ticket-123-more-cow-bells),这样您就知道给定的功能会影响多个 modules/repos.

如果您为每个模块使用单独的存储库,那么您可以使用 git 子模块将它们粘合在一起,但这更像是一种解决方法。

也许 reading about a few different git branching strategies 也能帮助您了解 'git thinks' 分支。