繁体   English   中英

如何设置git子模块

[英]How to set git submodules

场景

我们有一个大型项目,在子目录和相互依赖项中有很多子项目。 我们正计划将项目的一部分外包。

我们的项目结构是这样的(文本是子文件夹名称):

MAIN
|_Custom
|   |_Source
|   |   |_CustA (Contains multiple projects each in own directory)
|   |   |_CustB (Contains multiple projects each in own directory)
|   |
|   |_Dll
|   |  |_Debug
|   |  |_Release 
|   |
|   |_Lib
|      |_Debug
|      |_Release
|
|_Dll
|   |_Debug
|   |_Release
|
|_Lib
|  |_Debug
|  |_Release
|
|_Plugins
|  |_Dll
|  |  |_Debug
|  |  |_Release
|  |
|  |_Source
|     |_PluginA
|     |_PluginB
|
|_Source
   |_Module1
   |   |_M1A
   |   |_M1B
   |
   |_Module2
       |_M2A

如上所述,“自定义”部分是我们希望外包的内容。 这些自定义项目取决于要运行的Main / Custom / Dll,Main / Custom / Lib,Main / Dll,Main / Lib和Main / Plugins / Dll文件夹中的dll和lib文件。 这里的问题是,无论根驱动器如何,Main / Dll-Lib和Main / Plugins / Dll文件夹都必须在Main文件夹中保持完全相同的层次结构和位置。

也就是说,假设CustA下有一个项目,该项目依赖于Main中的某些dll。 CustA下的所有项目必须强制设置输出路径,以便exe和dll文件转到Main / Custom / Dll,而lib输出转到Main / Custom / Lib。 这些exe文件(假设它位于Release中)必须使用相对路径“ ...... \\ Dll \\ Release”来查找引用的主dll,该路径将指向Main / Dll / Release文件夹,并且对于任何main-插件dll。 它无法从其他任意设置的路径引用dll或lib。

要求:

当要由我们自己的人员克隆Main时,他们必须在Main下获得所有源代码,dll和文件。 但是对于Custom,必须创建Main / Custom / Source,Main / Custom / Dll和Main / Custom / Lib文件夹(如果git不允许使用空文件夹,它们可能包含一些空文件。),但是要创建特定的自定义模块(例如CustA及其子目录及其输出exe,dll和lib文件),请勿将其克隆。 自定义模块(CustA,CustB,CustC ...)必须根据需要在Main / Custom / Source文件夹下明确地一一拉出/克隆以获取其源代码,并构建为获取其exe-dll-lib文件。

另一方面,外包时,也必须易于设置。 在这里,他们应该能够克隆Main,使其获得Main / Dll,Main / Lib和Main / Plugins / Dll文件夹及其内容exe-dll-lib和其他输出文件,但不能获取源代码在Main / Source和Main / Plugins / Source中。 此外,由于将按Custom的每个模块完成外包,假设此开发人员已分配了CustA,则他必须能够轻松获取CustA下所有项目的源代码,但不能克隆/拉Custom /来源/客户B。

我已经尝试过的:

当前,整个Main及其内部的所有内容都备份到我们自己的服务器计算机上的SVN存储库中。 但是我们希望迁移到git,并使用Nulabs-backlog进行项目问题跟踪和管理。

我进行了一些研究,并使用虚拟文件创建了项目结构的副本,并且能够创建包含所有(我是“全部”)文件和子文件夹的测试存储库,但这不允许像我上面提到的那样进行受限访问。

我知道我可以将整个项目划分为多个较小的存储库,然后使用git子模块功能在其他存储库下引用特定的存储库。 因此,我从Main / Plugins / Source,Main / Source创建了单独的存储库,对于自定义模块,分别为Main / Custom / Source / CustA,Main / Custom / Source / CustB,Main / Custom / Source / CustC等创建了单独的存储库并将它们上传到远程。 然后,我为Main文件夹本身创建了一个存储库,并向其中添加了Main / Dll,Main / Lib,Main / Plugins / Dll文件夹。 在这里,#/ Source模块显示为子模块,乍一看似乎还可以。 当我将此主存储库推送到远程时,远程也显示CustA,CustB ...,Main / Source,Main / Plugins / Source等是子模块,而Dll和Lib文件夹显示正确的文件。

但是我不明白如何正确克隆它们。

问题:

当我从远程克隆Main repo时,克隆会重新创建外包方案,其中源文件夹不包含任何内容,因为它们是子模块,而Dll和Lib文件夹已正确填充。 但是,当我尝试显式拉出Main / Source或Main / Plugins / Source文件夹时,它不起作用。 既不允许我设置源文件夹的远程路径,因为这些文件夹本身是主存储库的一部分,也不允许我删除这些空的源文件夹然后重新创建并设置它们时执行“拉”操作反映实际子模块回购URL的远程路径。

我做错了分区吗? 还是克隆步骤错误? 如果是这样,我如何正确设置git来满足上述要求?

最终,我设法找到了很多关于SO本身的信息以及其他想法。

我使用了一个简单明了的Git工作树。 基本上,我将整个项目结构分为三个部分。

第1部分:存储实际的文件夹子文件夹结构以及dll,pdb,lib和头文件。 这些文件对于开发“自定义”部分以及“主”应用程序本身是必需的。 因此,此回购允许访问我们的本地团队和外包团队。

第2部分:存储与“ Main”应用程序本身的开发相关的实际代码(cpp)和csproj,sln和相关文件。 此仓库仅允许访问我们自己的本地团队。

第3部分:存储“自定义”模块。 这些模块被划分为每个模块(CustA,CustB,CustC ...)到其自己的存储库。 我们的本地团队可以访问所有这些存储库。 外包团队只能访问包含已分配给它的模块的存储库。

这些存储库中的每一个都已经有一个master和一个“ Develop”分支。 实际的开发是在源自“开发”分支的自定义分支上完成的,并在完全完成后合并回去。 “开发”分支将在每个发行版上同步到主版本,因此主分支始终只包含稳定的“发行”代码。

我编写了2个简单的bash脚本,以轻松设置开发存储库。

本地团队的脚本要求一个根文件夹,一个自定义模块的名称(如果正在开发自定义模块)和一个自定义模块库的URL(如果正在开发自定义模块)。 然后,它在运行它的本地计算机上创建一个空的Git存储库,根据所有开发场景的需要拉出“ Part 1”存储库,然后继续将“ Part 2”存储库拉入正确的文件夹。 并且,如果提供了自定义模块名称和URL,它将继续提取“第3部分”的相应存储库。 接下来,由于一般不会对“第1部分”存储库进行修改,为防止意外提交或推送,脚本会导航到其根文件夹,并将“ .git”重命名为其他名称,以便第1部分存储库充当存储库不再。 当您需要更改或更新此存储库时,需要将文件夹显式重命名为'.git'Pull / Sync,以将其更新为最新版本,然后进行更改和Push。 当然,有一个小问题,完成后,我们需要记住将'.git'文件夹重命名为其他名称,并注意将正确的头文件推送到第1部分,同时将代码推送到第2部分。

“第2部分”存储库和任何“第3部分”存储库将自动切换到“开发”分支,并且从本地计算机删除master分支。 当然,每当我们与遥控器同步时,主分支将被带回。

如果是外包团队,脚本将不会提取“第2部分”存储库。 它将专门要求一个根文件夹和一个自定义模块名称和URL,设置“ Part 1”和“ Part 3”存储库,重命名“ Part 1”存储库的“ .git”文件夹,切换到Develop分支“第3部分”中的,如果还将分支名称作为参数传递给脚本,则将从Develop派生一个新分支,并切换到该新分支。 再次,在这里我们将提供指导或规则,以便在对提交团队进行任何提交/推送之前进行操作,以便他们知道如何以及何时重新拉动“第1部分”存储库,并记住不要提交/推送到“第1部分”以及其他要遵循的规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM