我的问题最好用一个例子来描述。
假设我有一个项目“A”。
我还有一个项目“B”,取决于“A”。
另一个项目“C”也取决于“A”。
我的“主要”项目取决于“B”和“C”。它也可能直接取决于“A”。
当“main”==“D”
时,看起来有点像"dreaded diamond of inheritance"
这些是我的要求:
我希望能够在“main”的解决方案中编辑项目“A”,“B”和“C”的内容并提交更改(即我不想只包括DLL也是代码)。但由于“B”和“C”都依赖于“A”,因此应该强制它们引用相同的提交。
项目“A”,“B”和“C”很可能也被其他项目引用,因此我不能假设项目“main”的工作目录的所有权。
此外,应该可以将每个项目的存储库与外部存储库同步。
项目“A”,“B”,“C”和“main”应为
如何设置我的存储库来完成此任务?
答案 0 :(得分:6)
不要(ab)使用git或任何版本控制系统。
使用NuGet。
您不希望直接包含其他项目。相反,将每个依赖项打包到.nuget包中,并将其用于依赖项处理。虽然子模块似乎是问题的解决方案,但在实践中,使用适当的依赖关系管理而不仅仅包括其他项目要好得多。
TeamCity和其他CI系统,甚至TFS,允许您自动构建新的nuget包,TeamCity也可以充当nuget服务器。
如果您不想使用“真正的”NuGet服务器,您也可以在Intranet上的某个位置使用共享驱动器。
答案 1 :(得分:5)
使用 submodules approach ,我建议使用包含列表依赖项的模型,而不是依赖项层次结构:
创建一个“parent
”仓库,在其中“git submodule add
”D
,C
,B
和A
的子模块:
parent
D
C
B
A
为每个要编译的项目添加所需的符号链接(even in Windows)(意味着直接从自己的结构中查找其依赖项的来源)。
“parent
”repo将引用代表每个依赖项的SHA1的确切列表,这些依赖项是项目在父仓库历史记录中的特定时间编译/运行所需的确切版本。
而且,正如我在“true nature of submodules”中解释的那样,您可以在A
,B
,C
或D
中进行任何修改,推到各自的upstream repo
但是你不要忘记回到parent
repo,添加并提交表示依赖回购A
,B
,C
的新状态的SHA1修改,以及D
。
这是一个component approach,它具有解决任何重叠依赖关系的优势:如果B
和C
需要不同版本的{{1} },A
repo必须选择parent
的一个(且仅一个)版本。
添加到OP Onur的答案:
依赖关系必须是相对的
不一定:您可以在子模块中添加符号链接,如果它需要查看具有固定路径的符号链接。
创建“
A
”存储库如何自动检出正确的库集,例如上面的设置中的A和B
确定A和B的有效起始版本后,您可以在“父”上下文中创建并推送专用于其使用的分支。
然后你make those submodule follow that branch,意思是任何user
将检查子模块git submodule update --remote
和A
的专用分支的最新SHA1。
答案 2 :(得分:3)
只是为了确保我理解你的方法:
我需要做的事情来设置库存储库:
我需要做的事情是将一组选定的库包含到一个新项目中:
实际上,这意味着使用这些库的每个“用户”项目都由“父”存储库中的“from _...”分支表示和分支“for _... “在每个使用过的库存储库中。
设置现在应该如下所示
A
branch "for_user"
branch "master" (== for_parent)
<other branches for each project using this library>
B,C,D
<like A>
parent
submodule A - tracks branch dependent on the current branch
submodule B - tracks branch dependent on the current branch
<other submodules>
branch "master" (== from_parent)
branch "from_user"
<other branches for each project using one of the libraries>
user
<own stuff>
submodule A - tracks branch "for_user"
submodule B - tracks branch "for_user"
打开问题: