包含git子模块和父存储库的单个目录

时间:2018-06-19 12:21:21

标签: git git-submodules

用例: 我们有一个包含IDE配置的目录,其中的一些配置应在一组项目中共享,而某些特定于项目。这意味着config目录的某些部分必须与项目共享,而某些部分应来自集中式来源。

Directory

由于Project是一个git存储库,我考虑过使用git子模块来解决此问题。据我了解,如果我将config设为子模块,则必须通过该子模块共享project specific 1project specific 2。另一种选择是使shared 1shared 2成为单独的子模块。 git book并没有帮助我找到解决方案。

问题:

  • 有没有办法使一个包含shared1shared2一个子模块或其他构造,而project specific 1project specific 2仍然是其中的一部分Project git回购?
  • 如果是这样,解决方案看起来如何?
  • 这种方法是否存在缺陷(以及方法是否有缺陷),或者我是否很走运?

编辑1:

@Mark Adelsberger的响应:我们正在讨论的文件不是运行时配置,而是IDE的配置。因此,在构建阶段尝试解决此问题并不方便。

编辑2:

我遵循@Thomas的提示,并带有符号链接。我创建了一个包含sharedConfigshared1的子模块shared2,并将其放置在project中,然后在config中有两个符号链接,这些链接以{{ 1}}。遗憾的是,IDE使用的IDE不遵循符号链接,但会崩溃。如果您使用更成熟的工具,那么这可能是您的解决方案。

修改3:

我尽一切努力都同意@Mark Adelsberger,尽管有一些变通办法/黑客可能对某些平台/工具组合起作用,但我无法按照我的意愿去做。 最后,我将每个sharedConfig目录作为一个单独的子模块。

1 个答案:

答案 0 :(得分:0)

我不知道子模块与父存储库[1]共享目录。

可以使用多个模块,甚至可以让它们共享相同的物理仓库(通过为每个模块使用不同的分支);但是我认为那会很快带来不便。

如果在运行时使用配置文件,那么使用将文件移动到运行时需要它们的正确位置的构建过程可能就足够了。这样,您的源代码管理工作树结构就不必与上面显示的内容相匹配,并且为共享代码[2]提供了许多选择。您可以使用子模块,也可以使用(IMO甚至更好)您可以分别打包配置文件(作为(npm | maven | nuget |任何适合您技术的堆栈)工件,以供项目使用需要它。

如果配置文件是在开发时使用的(并且如果开发工具坚持认为它们在特定的位置),那会有些棘手-但仍可以通过在结帐后移动文件来管理。可以使用钩子(或可能是您的IDE或其他开发工具的某些功能)编写脚本,甚至自动进行编写。在这种情况下,您可能希望父存储库转到.gitignore目录。{p>


[1]虽然可能很清楚在您的用例中该如何工作,但通常会引入很多问题,而答案充其量只会导致某些违反直觉的行为。 (如果共享目录的父模块和子模块config/shared*对象都具有相同文件名的条目,会发生什么情况?如果将新文件添加到工作目录中,它将添加到哪个存储库中(或如何指定哪个)?

[2]与评论中的建议相反,我认为单一回购是项目共享代码的最糟糕方法之一。造成问题的可能性远大于解决问题的可能性。