Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置git子模块_Git_Git Submodules - Fatal编程技术网

如何设置git子模块

如何设置git子模块,git,git-submodules,Git,Git Submodules,情景 我们有一个大型项目,在子目录和相互依赖关系中有许多子项目。我们计划把项目的一部分外包出去 我们的项目结构是这样的 文本是子文件夹名称: MAIN |_Custom | |_Source | | |_CustA (Contains multiple projects each in own directory) | | |_CustB (Contains multiple projects each in own directory) | | | |_Dll |

情景

我们有一个大型项目,在子目录和相互依赖关系中有许多子项目。我们计划把项目的一部分外包出去

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

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文件夹必须在主文件夹中保持完全相同的层次结构和位置

也就是说,假设CustA下有一个项目,它依赖于主数据库中的某个dll。CustA下的所有项目必须强制设置输出路径,以便 exe和dll文件转到Main/Custom/dll,lib输出转到Main/Custom/lib。 这些exe(假设它在版本内)必须使用相对路径……\dll\Release查找引用的主dll,该路径将指向main/dll/Release文件夹,类似地,也可以查找任何主插件dll。它不能从其他任意设置的路径引用dll或lib

要求:

当我们自己的人克隆Main时,他们必须在Main下获取所有源代码、DLL和文件。但对于自定义,必须创建文件夹Main/Custom/Source、Main/Custom/Dll和Main/Custom/Lib。如果git不允许空文件夹,这些文件夹可能包含一些空文件。但是,特定的自定义模块(如CustA及其子目录)及其输出exe、Dll和Lib文件不得克隆。自定义模块custa、CustB、CustC。。。必须根据需要在主/自定义/源文件夹下逐个显式提取/克隆以获取其源代码,并构建以获取其exe dll lib文件

另一方面,当外包时,在他们的终端也必须很容易设置。 在这里,他们应该能够克隆Main,以便获得Main/Dll、Main/Lib和Main/Plugins/Dll文件夹及其内容exe Dll Lib和其他输出文件,而不是Main/source和Main/Plugins/source中的源代码。此外,由于外包将按自定义模块进行,假设该开发人员已被分配CustA,他必须能够轻松获得CustA下所有项目的源代码,但不能克隆/拉取Custom/source/CustB

我已经尝试过的:

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

我做了一些研究,用虚拟文件创建了一个项目结构的副本,并且能够用所有文件和子文件夹创建一个测试repo,但是这不允许像我上面提到的那样进行受限访问

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

但我不明白如何正确克隆这些

问题是:

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


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

最后,我通过大量的谷歌搜索和我在so上发现的其他想法设法解决了问题

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

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

第2部分:存储与“主”应用程序本身开发相关的实际代码cpp和csproj、sln和相关文件。此回购协议仅允许访问我们自己的本地团队

第3部分:存储“自定义”模块。这些模块分为CustA、CustB、CustC。。。它自己的回购协议。我们的本地团队可以访问所有这些回购协议。外包团队只能访问包含分配给它的模块的回购协议

这些回购协议中的每一个都已经有一个主回购协议和一个“开发”分支。实际开发是在从“开发”分支派生的自定义分支上完成的,并在完全完成后合并回来。“开发”分支将在每个发行版上与主版本同步,以便主版本分支始终只包含稳定的“发行”代码

我编写了2个简单的bash脚本,以便轻松设置开发repo

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

“第2部分”回购和任何“第3部分”回购将自动切换到“开发”分支,主分支将从本地机器中删除。当然,只要我们与远程同步,主分支就会被带回来


如果是外包团队,脚本将不会提取“第2部分”回购。它将特别要求根文件夹和自定义模块名称和URL,设置“Part 1”和“Part 3”repo,重命名“Part 1”repo的“.git”文件夹,切换到“Part 3”的开发分支,如果分支名称也作为参数传递给脚本,则将从Develop派生一个新分支并切换到这个新分支。同样,在向外包团队提交/推送之前,我们将提供一个指南或规则,以便他们知道如何以及何时重新提取“第1部分”回购,并记住不要提交/推送到“第1部分”,以及要遵循的其他规则。

如果您要外包某件东西,为什么不将该工作作为自定义依赖项包含?这将完全解决版本控制问题。另外,你的问题很长,你可能想把它缩短。对不起,问题太长了。我想适当地解释一下这种情况。我查看了自定义依赖项。看来我还得用其他的工具。目前,我们使用VS2012在Windows7上开发。外包项目主要是VC++/MFC,有时是.Net/C。NuGet可以管理.Net,但MFC需要其他东西。我们想让这更简单。我也在看git子树……我忘了提到外包部分实际上是“插件”项目,它将提供额外的对话框/UI窗口和额外的功能。这些插件项目输出dll文件。这些DLL将由我们的主应用程序加载,以提供这些额外功能。因此,这些项目本身不能作为独立应用程序运行。它们依赖于主应用程序自己的默认DLL来实现常见功能,如xml解析、文件读取等,并且大多数情况下需要根据客户的要求以某种自定义/特定的方式操作某些数据。