繁体   English   中英

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

[英]How do I set up my git repositories to easily be able to reuse projects in 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”和“主要”应该是

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

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

使用NuGet

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

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

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

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

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

parent
  D
  C
  B
  A

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

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

而且,正如我在“ 子模块的真实性质 ”中所解释的那样,您可以在ABCD进行任何修改,并推送到各自的上游回购
但是你不能忘记回到parent repo,添加并提交表示依赖回购ABCD的新状态的SHA1修改。

这是一个组件的方法 ,其具有解决任何重叠依赖性的优势在于:如果BC需要不同版本的A ,所述parent回购将必须选择一个(并且只有一个)的版本A

要添加OP Onur的答案:

依赖关系必须是相对的

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

创建“ user ”存储库

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

确定A和B的有效起始版本后,您可以在“父”上下文中创建并推送专用于其使用的分支。
然后你让那些子模块跟随那个分支 ,这意味着任何git submodule update --remote都会检查子模块AB专用分支的最新SHA1。

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

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

  1. 创建“父”存储库
  2. 为每个库创建一个子模块
  3. 依赖关系必须是相对的,即如果D依赖于B,则路径应该看起来像../../B/some文件夹
  4. 父存储库中的每个提交都代表一个有效的库组合

我需要做的事情是将一组选定的库包含到一个新项目中:

  1. 创建“用户”存储库
  2. 在所需的库中创建一个分支各自的存储库(例如A和B),如“for_user”,并在“user”项目中跟踪子模块。
  3. 在“父”存储库中创建一个“from_user”分支,用于跟踪已使用库的更改( 是否可以在每个分支基础上跟踪存储库分支? )。
  4. 包括所选的库集,例如“for_user”分支中的A和B.
  5. 在A和/或B中进行的更改将转到此分支,并且可以合并到“父”主分支中(如果合适)和/或合并到使用这些库的其他项目的其他“from _...”分支中。 “父”项目用于创建一致的库集。

实际上,这意味着使用这些库的每个“用户”项目都由“父”存储库中的“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? 可以查看所有可用的库,但这将以某种方式消除每个库需要单独的子模块

暂无
暂无

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

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