Git:由多个子项目组成的单个项目的最佳方法?
导言 我想知道对于由多个子项目组成的单个项目来说,配置Git的最佳策略是什么,其中一些子项目是共享的,而另一些子项目是独立的 但其中一些可以依赖于共享的,如在以下场景中,项目是一个REST客户机/服务器体系结构,具有一个API服务器和多个客户机:Git:由多个子项目组成的单个项目的最佳方法?,git,version-control,Git,Version Control,导言 我想知道对于由多个子项目组成的单个项目来说,配置Git的最佳策略是什么,其中一些子项目是共享的,而另一些子项目是独立的 但其中一些可以依赖于共享的,如在以下场景中,项目是一个REST客户机/服务器体系结构,具有一个API服务器和多个客户机: /MyProject |___ /DB_sql |___ /APIServer_php |___ /WebClient_jvs |___ /AppClient_iOS |___
/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方法”作为我的第三个选项。因此,你的回答似乎证实了这可能是正确的方法,但你能否扩展你的回答,解释哪些是潜在的陷阱?