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

时间:2017-01-05 12:32:11

标签: git version-control

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

 /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不再能看到更改。

使用子模块的多个单个.git方法 我还没试过,所以我不确定哪些是陷阱。

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

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

1 个答案:

答案 0 :(得分:3)

单个.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