Git:由多个子项目组成的单个项目的最佳方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git:由多个子项目组成的单个项目的最佳方法?相关的知识,希望对你有一定的参考价值。

简介我想知道哪个可以是为几个子项目组成的单个项目配置Git的最佳策略,其中一些项目是共享的,而另一些是独立的,但其中一些可以依赖于共享项目,如下面的场景所示:该项目是一个REST客户端/服务器架构,带有API服务器和多个客户端:

 /MyProject       
      |___ /DB_sql
      |___ /APIServer_php
      |___ /WebClient_jvs
      |___ /AppClient_ios
      |___ /AppClient_android

开发环境包括一个Git服务器,一个或多个开发和测试代码的开发人员工作站,以及一个运行api服务器和db的阶段服务器:

                  GIT REPO SERVER
       _________________|________________
      /                                  \
  DEVELOPER(s)                          STAGE
 WORKSTATION(s)                         SERVER
      |                                   |
 /MyProject                          /MyProject
      |___ /DB_sql                        |___ /DB_sql
      |___ /APIServer_php                 |       |___ .git
      |___ /WebClient_jscript             |       |___ (sub project files)
      |___ /AppClient_iOS                 |
      |___ /AppClient_Android             |___ /APIServer_php
                                                   |___ .git
                                                   |___ (sub project files)

每个客户端都是针对每个平台单独开发的,但是如果没有服务器则无法进行测试,并且服务器是逐步开发的,测试其新功能在客户端上的可用性,因此它们也是逐步开发的,有时是不同的时间有时并行。必须通过版本控制跟踪许多不同的阶段。每个子项目都必须拥有自己的跟踪历史记录,但是在耦合跟踪历史记录中也很有用(例如,在api服务器和特定客户端上开发和测试新功能时),当然还有完整的功能项目历史记录,用于跟踪版本。可以在开发者工作站或舞台服务器上修改apiserver代码。

据我所知,为此类问题设置git可能有三种不同的方法:

具有多个子分支的单个.git在主文件夹中只有一个.git,并且每个主题和/或平台分支,如

 /MyProject 
      |___ .git      
      |___ /DB_sql
      |___ /APIServer_php
      |___ /WebClient_jscript
      |___ /AppClient_iOS
      |___ /AppClient_Android

但是这样就不可能在没有下载客户端代码的情况下更新舞台服务器上ApiServer的代码,这当然是不必要的和不可取的,并且当不同主题的不同子分支在不同时很容易搞乱子项目。

多个.git另一种方法是git init每个子项目目录,如

 /MyProject 
      |___ .git      
      |___ /DB_sql
      |              |___ .git
      |              |___ (sub project files)
      |
      |___ /APIServer_php
      |              |___ .git
      |              |___ (sub project files)
      |
      |___ /WebClient_jscript
      |              |___ .git
      |              |___ (sub project files)
      |
      |___ /AppClient_iOS
      |              |___ .git
      |              |___ (sub project files)
      |
      |___ /AppClient_Android
                     |___ .git
                     |___ (sub project files)

所以要有不同的历史,但这样我们就失去了跟踪的能力,例如当一个新功能被添加到服务器和客户端时,因为如果我们在子项目目录中执行git commit,主文件夹git看不到不再是变化。

多 使用Submodules的单一.git方法我还没有尝试过,所以我不确定哪些是陷阱。

问题我不知道上述哪种方法更可取,或者是否存在其他方法,但由于服务器/客户端开发周期相当典型,我认为有一些最佳实践可供参考。在StackOverflow上,我发现了一些关于多个项目的其他问题,但没有人详细解释哪个是首选策略及其原因。

您能描述一下管理所描述场景的首选方式,即用户任务流以及如何使用Git实现它?

答案

使用子模块的单个.git子分支更适合您的情况。让我们看看下面的原因:

多个.git表示多个存储库。由多个存储库管理的项目不是一个好主意,正如您所说,它可能会失去跟踪能力。

为什么要分支?您可以根据不同的工作站创建不同的分支,以便开发人员可以并行工作。如果将其视为子模块,它可以更新舞台服务器。您可以通过git submodule add <URL for stage server>添加子模块。如果要进行更改并将其推送到舞台服务器。你只需要cd submoduleFoldergit commit -am 'change for stage server'git push

您需要注意一件事:将阶段服务器用作子模块后的git状态。假设在master分支中,您更新子模块(阶段服务器)。你可以cd submodulefolder,然后提交并推送更改到舞台服务器。但是在子模块文件夹cd..之外,您还可以提交在开发人员工作站中记录子模块的更新(使用git status,你会发现它是changes not staged for commit)。但是如果你忘记提交并想要切换到另一个分支,如果有changes not staged for commit,git将阻止你切换其他分支。但它不适用于子模块,如果子模块中有changes not staged for commit,您仍然可以切换到其他分支。所以这是你应该知道的事情,而且经常使用git status可以让你清醒。

有关子模块的更多信息,请参阅submodules

以上是关于Git:由多个子项目组成的单个项目的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

为单个项目添加多个远程仓库(Git操作)

Git 分支管理最佳实践

单个目录指向多个git存储库

使用 git 为我的项目维护骨架的最佳方法

windows下设置由多个项目组成的解决方法的编译环境

使用单个laravel实例的多个项目