5

My problem may be best described with an example.

Assume I have a project "A".

I also have a project "B" which depends on "A".

Another project "C" also depends on "A".

My "main" project depends on "B" and "C". It may also be that it also depends directly on "A".

Looks a bit like the "dreaded diamond of inheritance" when "main" == "D"

dreaded diamond of inheritance

These are my requirements:

  • I'd like to be able to edit the content of projects "A", "B" and "C" in the solution for "main " and submit changes (i.e. I don't want just to include the DLL but also the code). But since "B" and "C" both depend on "A", it should be enforced that they reference the same commit.

  • The projects "A", "B" and "C" will most likely also be referenced by other projects, so I cannot assume ownership of the working directory for project "main".

  • Also it should be possible to sync the repositories for each project with external repositories.

  • The projects "A", "B", "C" and "main" should be

How do I need to set up my repositories to accomplish this?

4

3 回答 3

6

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

使用NuGet

您不想直接包含其他项目。相反,将每个依赖项打包到一个 .nuget 包中,并将其用于依赖项处理。虽然子模块似乎是解决问题的方法,但在实践中,使用适当的依赖管理而不是仅仅包含其他项目会更好。

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

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

于 2013-11-04T13:27:37.163 回答
5

使用子模块方法,我会推荐一个包含依赖列表的模型,而不是依赖层次结构:

创建一个“ parent”存储库,您可以在其中“ git submodule add”用于DCB的子模块A

parent
  D
  C
  B
  A

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

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

而且,正如我在“子模块的真实性质”中解释的那样,您可以在 、 或 中进行任何您想要的修改A,然后B推送到它们各自的上游仓库。 但是你一定不要忘记回到repo,添加并提交代表依赖 repos 新状态的 SHA1 修改,,, 和。CD
parentABCD

这是一种组件方法,它具有解决任何重叠依赖项的优点:如果需要不同版本B的.CAparentA

要添加到 OP Onur 的答案:

依赖关系必须是相对的

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

创建“ user”存储库

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

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

于 2013-11-04T11:58:38.993 回答
3

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

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

  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?我可以检查所有可用的库,但这会以某种方式消除对每个库的单独子模块的需要
于 2013-11-04T12:12:11.017 回答