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

Git:由多个子项目组成的单个项目的最佳方法?,git,version-control,Git,Version Control,导言 我想知道对于由多个子项目组成的单个项目来说,配置Git的最佳策略是什么,其中一些子项目是共享的,而另一些子项目是独立的 但其中一些可以依赖于共享的,如在以下场景中,项目是一个REST客户机/服务器体系结构,具有一个API服务器和多个客户机: /MyProject |___ /DB_sql |___ /APIServer_php |___ /WebClient_jvs |___ /AppClient_iOS |___

导言 我想知道对于由多个子项目组成的单个项目来说,配置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的代码,这当然是不必要和不可取的,而且当在不同的子项目中有不同主题的不同分支时,很容易把事情搞砸

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

 /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准确地实现它?

Single。带有子模块的子分支Git更适合您的情况。让我们看看下面的原因:

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

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

有一件事需要注意:将stage服务器用作子模块后的git状态。 假设在主分支中,更新子模块(后台服务器)。您可以
cd submodulefolder
,然后提交更改并将其推送到后台服务器。但是,在子模块文件夹
cd..
之外,您还可以提交以在开发人员工作站中记录子模块的更新(使用git状态,您将发现它的
更改未暂存以提交
)。但是,如果您忘记提交,并且希望切换到另一个分支,如果有
更改没有为提交进行暂存
,git将阻止您切换其他分支。但它不适用于子模块,如果子模块中有
更改没有提交
,您仍然可以切换到其他分支。所以这是你应该知道的,经常使用
git status
可以让你头脑清醒


关于子模块的更多信息,您可以参考。

谢谢您,Marina,我注意到我的文本中有一个错误,实际上我想说“Single.git方法”而不是“Multiple.git方法”作为我的第三个选项。因此,你的回答似乎证实了这可能是正确的方法,但你能否扩展你的回答,解释哪些是潜在的陷阱?