问题
I'm working on a "modular Java application", it has around 60 independent modules, all obviously "buildable" on their own.
I'm trying to understand what can be the best approach to structure this type of application under GIT.
I'll explain better myself:
I've been working several years with SVN and it would be really easy for me to structure a project like this under a centralized version control tool such as SVN, while I'm not sure about the GIT best practices and pros/cons.
With SVN:
I would import all the project under the same repository
I would consider two different approaches, with similar consequences, for example:
mod_A
|___trunk
|___branches
| |___branch_A
|
|___tags
mod_B
|___trunk
|___branches
| |___branch_A
| |___branch_B
|
|___tags
OR
trunk
|___mod_a
|___mod_b
|___mod_c
branches
|___branch_A
| |___mod_a
|___branch_B
|___mod_a
|___mod_b
With both the approaches it would be really easy for me to achieve information like, which are the modules branched for a particular feature, and see the application from the modules prospective but also from the branches prospective.
Moreover, with both the structures I would be able to easily branch just some of the modules without being forced to branch them all anytime.
With GIT:
At the moment the modular application i'm working with is structured with a single independent repo for any module, in my view this structure, even if brings some advantages, has also a real big issue.
In fact it looks hard for me to have a clear whole overview of the application, cause I've to connect to every single repository and check the branches to understand which modules are involved in a particular branch, so if I've to manage a branched version of my application, that for example involves just 7 modules to be branched in a particular BUG_FIXING or FEATURE branch and not the whole application, I would have no way to get this info through GIT, and I should manage this information in a custom way.
Then even if the application would have been set up within the same repo, i would have been unable to decide to branch just a subset of modules cause "Git operates on the entire repository, not on individual directories".
Can you please clarify how can be the best approach to follow with a modular application, can GIT sub modules be a solution? Is there any other approach i'm not considering, or i'm moving from wrong assumptions?
Thanks a lot!
回答1:
First you should manage the module Java application in one git repo as you managed in one SVN repo, since all the modules are works for the same project.
For the branching module structure for you application, I will suggest manage each module in separate branches(modX), and manage your entire project in master branch.
The work flow can be:
Manage the project level files in
masterbranch. the structure for master branch as:Root (master branch) |___... (project level files)Checkout module branches (such as
modAbranch,modBbranch andmodCbranch) from master. Deleted the project level files and add files for module inmod_Xfolder.Such as for branch modA, the structure is:
Root (modA branch) |___mod_A (folder) |___... (module A level files)When you finished work for module X, then merge
modXbranch intomasterbranch.After all the modules are finished work (and merged into
master), the file structure formasterbranch should be: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)If you update module X in
modXbranch, then mergemodXbranch again intomasterbranch to make sure the application is updated.To maintain project-level (application aggregator) files, you can also develop/test/fixbug on
develop,featureandhotfixbranches:masterbranch as the production version for your java application.developbranch (long living branch which should checkout frommasterbranch) is used for all the developers work on it. When the changed application is build successful (verified), you can mergedevelopbranch intomaster.featurebranches are short living branches. If you need to develop new features for your application, you can checkout a feature branch fromdevelopbranch. And then the feature is finished, merge feature branch intodevelopbranch to verify your code.hotfixbranches are also short living branches. You can fix bugs on the branches, when the bug(s) is fixed, merge the hotfix branch intodevelopbranch.
And there has a successful branching model you can refer for managing the project-level (application aggregator) files.
回答2:
Aside: Do not use branches to manage different modules. Branches are to be short lived and ultimately merged back to master when ready for release.
If the modules "change/release" together, you could lean towards keeping them in one repo. Though the fact that each module had its own trunk/branches folders in SVN seems to indicate they change separately.
If you're using maven with your java application, it could be setup in one repo as a multi-module project.
If you go with separate repos, you can name your branches similarly (add a ticket number or such like feature/ticket-123-more-cow-bells) so you know a given feature impacts multiple modules/repos.
If you go with separate repos per module, then you could use git sub-modules to glue them back together but that's more of a workaround.
Perhaps also reading about a few different git branching strategies would help you understand how 'git thinks' about branches.
来源:https://stackoverflow.com/questions/47325910/modular-java-application-on-git-repository