如何设置我的git存储库以便轻松地在Visual Studio中重用项目

Onu*_*nur 5 git visual-studio-2010 visual-studio

我的问题最好用一个例子来描述.

假设我有一个项目"A".

我还有一个项目"B",它取决于"A".

另一个项目"C"也取决于"A".

我的"主要"项目取决于"B"和"C".它也可能直接取决于"A".

当"主要"=="D"时,看起来有点像"可怕的继承钻石 "

可怕的继承钻石

这些是我的要求:

  • 我希望能够在"main"的解决方案中编辑项目"A","B"和"C"的内容并提交更改(即我不想只包含DLL而是代码).但由于"B"和"C"都依赖于"A",因此应该强制它们引用相同的提交.

  • 项目"A","B"和"C"很可能也会被其他项目引用,因此我不能假设项目"main"的工作目录的所有权.

  • 此外,应该可以将每个项目的存储库与外部存储库同步.

  • 项目"A","B","C"和"主要"应该是

我如何设置我的存储库来完成此任务?

Wil*_*ert 6

不要(ab)使用git或任何版本控制系统.

使用NuGet.

您不希望直接包含其他项目.相反,将每个依赖项打包到.nuget包中,并将其用于依赖项处理.虽然子模块似乎是问题的解决方案,但在实践中,使用适当的依赖关系管理而不仅仅包括其他项目要好得多.

TeamCity和其他CI系统,甚至TFS,允许您自动构建新的nuget包,TeamCity也可以充当nuget服务器.

如果您不想使用"真正的"NuGet服务器,您也可以在Intranet上的某个位置使用共享驱动器.


Von*_*onC 5

使用子模块方法,我建议使用包含依赖项列表的模型,而不是依赖项层次结构:

创建" parent"回购,其中你" git submodule add"子模块为D,C,BA:

parent
  D
  C
  B
  A
Run Code Online (Sandbox Code Playgroud)

添加编译每个项目所需的任何符号链接(甚至在Windows中)(意味着从自己的结构中查找其依赖项的源).

" parent"repo将引用代表每个依赖项的SHA1的确切列表,它们是在父代repo历史记录中的特定时间编译/运行项目所需的确切版本.

而且,正如我在"解释子模块的真性情 ",就可以让你想在任何修改A,B,CD,并推动各自的上游回购.
但你一定不要忘记回到parent回购,添加和提交代表因回购的新状态的SHA1修改A,B,C,和D.

这是一种组件方法,它具有解决任何重叠依赖的优点:如果B并且C需要不同版本A,则parentrepo将必须选择一个(且仅一个)版本A.

要添加OP Onur的答案:

依赖关系必须是相对的

不一定:您可以在子模块中添加符号链接,如果它需要查看另一个具有固定路径的符号链接.

创建" user"存储库

如何自动检出正确的库集,例如上面的设置中的A和B.

确定A和B的有效起始版本后,您可以在"父"上下文中创建并推送专用于其使用的分支.
然后,你让那些子模块遵循分支,这意味着任何git submodule update --remote将签出的子模块是专用分支的最新SHA1 AB.