将Visual Studio解决方案解耦为多个(相互依赖的)git存储库

时间:2017-10-22 17:22:18

标签: git visual-studio projects-and-solutions

我正在开发一款游戏及其引擎,并且一直在同时处理它们,因此有一个解决方案文件引用了以下(简化)目录结构中的所有项目:

Root
├───Engine
│   ├───Library1
│   ├───Library2
│   └───Library3
├───Game
│   ├───Game
│   ├───Tool1
│   └───Tool2
└───GlobalSolution.sln

构建过程编译所有引擎库并将它们链接到一个静态库中,而游戏是一个可执行文件,它与生成的静态库链接,类似于某些工具。

不幸的是我拥有相同git存储库中的所有内容,而我希望有一个引擎存储库和一个当前游戏存储库,因为引擎本身并不真正有用(虽然它可以单独编译)但我可能想要创建另一个我应该能够在自己的存储库中托管的游戏。

我能想出的唯一结构如下:

Root
├───Engine
│   ├───Library1
│   ├───Library2
│   ├───Library3
│   └───EngineSpecificSolution.sln
├───GameA
│   ├───GameASpecifics
│   ├───ToolA1
│   ├───ToolA2
│   └───GameASpecificSolution.sln
└───GameB
    ├───GameBSpecifics
    ├───ToolB1
    └───GameBSpecificSolution.sln

在这种情况下,我只需要通过将$(SolutionDir)\..\Engine\Build\添加到游戏解决方案的库路径来引用引擎库。不幸的是,我失去了在一个VS窗口中拥有所有内容(引擎和游戏)的便利,并且需要在单独的窗口中编码,不是吗?当然,每次我对引擎进行更改时,我都必须手动编译游戏解决方案,而不是让VS一次性处理所有项目。

有没有关于如何将项目正确地分离到多个存储库并尽可能方便地保持工作的建议?

1 个答案:

答案 0 :(得分:0)

这是为git submodules创建的内容。

许多人觉得git子模块的运作方式并不容易,所以一开始可能会有一些痛苦,但是掌握了它,它是一个非常有用的工具。

我将展示一种方法来实现它并且不会进入git-submodule的具体细节,但不要犹豫,搜索git-submodule问题,提出新问题并ping如果您需要澄清某些观点,请在评论中提及。

首先,在特定的git存储库中创建一个包含Engine项目的解决方案(.git目录就是为了向您展示什么是git repo,什么不是):

Root
├───Engine
    ├───.git/
    ├───Library1
    ├───Library2
    ├───Library3
    └───EngineSpecificSolution.sln

使用git:

$ mkdir Engine && cd Engine
$ git init
** Create the Engine solution **
$ git commit -a -m "First commit for Engine"
$ git remote add origin https://github.com/user/engine.git
$ git push -u origin master

然后创建游戏目录,并将Engine存储库添加为子模块:

Root
├───Engine
│   ├───.git/
│   [...]
├───GameA
│   ├───.git/
│   ├───Engine
│   │   ├───.git/
│   │   ├───Library1
│   │   ├───Library2
│   │   ├───Library3
│   │   └───EngineSpecificSolution.sln
│   ├───GameASpecifics
│   ├───ToolA1
│   ├───ToolA2
│   └───GameASpecificSolution.sln
└───GameB
    ├───.git/
    ├───Engine
    │   ├───.git/
    │   ├───Library1
    │   ├───Library2
    │   ├───Library3
    │   └───EngineSpecificSolution.sln
    ├───GameBSpecifics
    ├───ToolB1
    └───GameBSpecificSolution.sln

使用git:

为GameA创建解决方案
$ mkdir GameA && cd GameA 
$ git init

# The following command creates a link to the Engine submodule
$ git submodule add https://github.com/user/engine.git Engine

# The following command will clone the submodule's repository in place of Engine directory
$ git submodule update

** Create the GameA solution and add Engine projects to solution **
$ git commit -a -m "First commit for GameA"
$ git remote add origin https://github.com/user/gamea.git
$ git push -u origin master

现在,GameA包含除引擎代码之外的所有内容,并在特定提交时引用引擎存储库。 当您仅对GameA进行更改时,您只需要在GameA中创建一个提交。当您在GameA和Engine中进行更改时,您需要先在Engine中创建提交,然后在GameA中创建。 GameA中的提交将包括对Engine引用的更改,因为引用的提交将发生更改。

当您对Engine进行更改时,您可以在Root/EngineRoot/GameA/EngineRoot/GameB/Engine中进行更改,并使用git push和{同步您的更改{1}}。

相关问题