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

时间:2013-10-30 12:16:17

标签: visual-studio-2010 git visual-studio

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

假设我有一个项目“A”。

我还有一个项目“B”,取决于“A”。

另一个项目“C”也取决于“A”。

我的“主要”项目取决于“B”和“C”。它也可能直接取决于“A”。

当“main”==“D”

时,看起来有点像"dreaded diamond of inheritance"

dreaded diamond of inheritance

这些是我的要求:

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

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

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

  • 项目“A”,“B”,“C”和“main”应为

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

3 个答案:

答案 0 :(得分:6)

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

使用NuGet

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

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

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

答案 1 :(得分:5)

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

创建一个“parent”仓库,在其中“git submodule addDCBA的子模块:

parent
  D
  C
  B
  A

为每个要编译的项目添加所需的符号链接(even in Windows)(意味着直接从自己的结构中查找其依赖项的来源)。

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

而且,正如我在“true nature of submodules”中解释的那样,您可以在ABCD中进行任何修改,推到各自的upstream repo 但是你不要忘记回到parent repo,添加并提交表示依赖回购ABC的新状态的SHA1修改,以及D

这是一个component approach,它具有解决任何重叠依赖关系的优势:如果BC需要不同版本的{{1} },A repo必须选择parent的一个(且仅一个)版本。

添加到OP Onur的答案:

  

依赖关系必须是相对的

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

  

创建“A”存储库

     

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

确定A和B的有效起始版本后,您可以在“父”上下文中创建并推送专用于其使用的分支。
然后你make those submodule follow that branch,意思是任何user将检查子模块git submodule update --remoteA的专用分支的最新SHA1。

答案 2 :(得分:3)

只是为了确保我理解你的方法:

我需要做的事情来设置库存储库:

  1. 创建“父”存储库
  2. 为每个库创建一个子模块
  3. 依赖关系必须是相对的,即如果D依赖于B,则路径应该看起来像../../B/some文件夹
  4. 父存储库中的每个提交都代表一个有效的库组合
  5. 我需要做的事情是将一组选定的库包含到一个新项目中:

    1. 创建“用户”存储库
    2. 在所需的库中创建一个分支(例如A和B),如“for_user”,并在“user”项目中跟踪子模块。
    3. 在“父”存储库中创建一个“from_user”分支,用于跟踪已使用库的更改(是否可以在每个分支的基础上跟踪存储库分支?)。
    4. 包括所选的一组库,例如来自“for_user”分支的A和B.
    5. A和/或B中所做的更改将转到此分支,并且可以合并到“父”主分支中(如果合适)和/或合并到使用这些库的其他项目的其他“from _...”分支中。 “父”项目用于创建一致的库集。
    6. 实际上,这意味着使用这些库的每个“用户”项目都由“父”存储库中的“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"
      

      打开问题:

      • 如何自动检出正确的库集,例如上面的设置中的A和B?我可以检查所有可用的库,但这会以某种方式消除每个库需要单独的子模块