Windows 如何在不同布局的VisualStudio解决方案中处理Git子模块?

Windows 如何在不同布局的VisualStudio解决方案中处理Git子模块?,windows,visual-studio,git,git-submodules,Windows,Visual Studio,Git,Git Submodules,我们使用visualstudio2010(用C语言)开发,不久前从SVN迁移到GIT。现在,我们尝试将我们的存储库(相当大,约30000个文件)拆分为许多git存储库,每个解决方案对应一个。 这些解决方案共享一些项目,大部分是我们内部开发的库,并且喜欢从所有解决方案中添加这些库 新的存储库有一个平面布局。每个项目一个子目录(共享项目是子模块)。 在古老的大型回购协议中,项目是树形结构的 子模块中的外部引用出现问题。在新的回购协议中,引用项目的路径可能是“……libs\someproject”,而

我们使用visualstudio2010(用C语言)开发,不久前从SVN迁移到GIT。现在,我们尝试将我们的存储库(相当大,约30000个文件)拆分为许多git存储库,每个解决方案对应一个。 这些解决方案共享一些项目,大部分是我们内部开发的库,并且喜欢从所有解决方案中添加这些库

新的存储库有一个平面布局。每个项目一个子目录(共享项目是子模块)。 在古老的大型回购协议中,项目是树形结构的

子模块中的外部引用出现问题。在新的回购协议中,引用项目的路径可能是“……libs\someproject”,而在新布局中,正确的路径可能是“.\someproject”

我们已经有了一些关于这方面的编辑战,并不热衷于更多

我能想到的半生不熟的解决方案:

  • 在…csproj.user中使用“引用路径”,并将此文件从版本控制中排除(必须为每个开发人员在每次重新访问清理后重新创建)

  • 针对每种情况使用分支,并尝试教每个人“真正的”提交应该去哪里,以及“环境变化”提交应该去哪里(子模块已经不是最简单的概念…)

  • 嵌入二进制文件而不是子模块(但是如何开发子模块的更改?如何开发不同的log4net版本?)


有人知道一个健全的解决方案吗?

使用一个子模块来容纳所有“公共库”。只有一级。但是,您应该使用定义良好的契约将公共库作为服务移动。通过这种方式,您可以在没有停机时间的情况下增量推出新版本。这样,每个模块中只有一个子模块保存合同。这些可能是接口或消息。

既然您要求一个合理的解决方案,我只能建议您考虑设置自己的NuGet服务(查看以获得灵感)


如果我理解正确,问题是Visual Studio而不是Git?如果是这种情况,请使用与VisualStudio一起使用的旧树结构。使您的子模块结构也成为树结构。因此,树的顶部将是一个超级回购协议,其子模块(分支)将有自己的子模块,直到你看到树的叶子。这将是一个痛苦的设置在第一次,但它应该只是工作

> P>如果你走包管理的路线,考虑OpenWRAP。然而,在源代码中嵌入包管理人工制品是一个坏主意。您可以使用这些工具来更新子模块中实际存储的内容,但在构建时不要依赖它们。从构建脚本的角度来看,二进制文件应该存在。

我在使用VS2013时也遇到了类似的问题

我想直接使用git svn而不是svn。SVN有一组庞大的目录。我无法创建一个包含所有主干文件夹的git存储库。Git总是带着错误退出,并且存储库已损坏。我通过以下方法解决了这个问题:

  • 使用git svn,我通过为每个文件夹创建一个git存储库,从svn/trunk克隆了所需的文件夹子集
  • 创建了包含所有my git svn克隆文件夹的本地父git存储库
  • 每个git存储库都作为子模块添加到父git存储库中
  • VisualStudio的问题在于,它无法识别我打开解决方案的主项目之外的多个项目。此解决方案位于一个文件夹中,该文件夹包含Visual Studio识别为受git源代码管理的唯一文件


    我尝试设置git首选项,将上级父目录用作git repository的位置,但没有注意到任何差异。

    可能我不理解您的答案。您似乎提出了一个解决方案布局。我的问题不是关于解决方案布局,而是关于如何为不同解决方案中的子模块处理不同的环境。这应该在to级别加以考虑。子模块项目应该继承它。比如说对于nhibernate,您有一些共同的功能。现在,您希望在windows服务ap和web ap中使用它。您需要在顶部设置线程。其他设置也一样。我猜您是在暗示通过合理的依赖关系管理从源代码包含移动到DLL包含。如果是,听起来很诱人,但现在我们开发共享库作为封闭解决方案的一部分。似乎是解决问题的一个相当复杂的方法。据我所知,如果它们是独立的VS项目,它不应该在可行性方面造成问题,但事实上,它并不是您可能要寻找的快速破解。。。如果您担心调试,那么nuget支持链接到符号源服务器以保持调试体验,但是如果在主项目和支持项目之间有很多来回,这可能是一个问题。我对w.r.t.有点犹豫不决。git子模块缺乏优雅,我想建议一个您没有列出的替代方案(并且支持版本控制!)。我有点遗憾的是,当我作为一个团队使用.NET时,这个选项不可用。VisualStudio在依赖项方面是出了名的愚蠢。这种方法有很多优点。但对我来说最重要的是,从开发人员的角度来看,项目的设置、编译和编程将变得更快。当我签出一个新项目时,我只需要获取所有需要的库,并且只需要编译项目库来运行它。不仅如此,使项目更容易理解的那些子项目的杂乱无章也消失了。一个很好的好处是,现在必须对子项目的更改进行版本控制,以便人们知道所做的哪些更改使代码破坏更容易跟踪。我会看一看OpenWrap,它可以处理nuget repos,但您会得到更多的考虑