Unity3D和Git子模块有可能吗?

人气:794 发布:2022-10-16 标签: git unity3d git-submodules

问题描述

TLDR;这将是一篇长篇大论的帖子,但我相信你们中的许多Unity3D开发人员也遇到了与我相同的问题这个问题需要一个明确、明确、一劳永逸的答案来挽救我们的集体理智。

所以在过去的两年多里,我一直在使用Git,但我并没有太深入地研究它。我可以从BitBucket/GitHub等分支/合并推拉,这很适合常规的Win表单/传统应用程序。

问题是这样的。我早就从XNA/Silverlight转到了Unity3D,在unity中,为了添加对库的引用,您实际上必须将源文件从该库复制到unity项目文件夹中。尽管Unity确实允许您将*.dll文件放到插件文件夹中,但存在明显的跨平台兼容性问题,因此我永远不想去那里。

我有十几个库项目,提供从人工智能到内容管理、日志记录、抽象用户输入系统等各种功能,我一直在为未来我将制作的游戏开发一个新的关卡编辑器。

每个单独的库项目本身都是一个统一项目,每个项目的代码文件都是按照统一的方式组织起来的

Assets<company name><project name>
Assets<company name><library name>
Assets<company name><another library name>

我这样做是为了保持高度的组织,不同于unity资产存储上的许多其他资产。:(

所以我的关卡编辑器项目使用了多个库项目,这些库项目的代码是通过复制粘贴导入的。每个库本身都托管在它们自己的本地git库中。因此,当我将代码文件从库项目复制粘贴到我的主unity项目时,我自动失去了提交我对库git repo所做更改的任何能力。

我去年一直在做的就是休养生息

启动主项目Assets<company name><main project name> 导入任何库项目(复制/粘贴代码文件)Assets<company name><library name> 如果我需要更改某个库,我通常只编辑我正在处理的主项目中的库代码文件。(否则会出现更复杂的情况) 因为主项目也是GIT资源库,所以我对任何库文件所做的更改也会提交到主项目的资源库。 过了一会儿,我使用CodeCompare(一种diff实用程序)将Assets<company name><library name>与我以前从中复制库文件的原始位置进行了文件夹比较。 我煞费苦心地逐一比较每个已更改的代码文件,并将主项目中所做的更改迁移到库的原始位置。 现在已经完成了,该库是一个git回收库,因此我必须再次(第二次)提交对代码文件所做的各种更改。

伴随着这种疯狂,这里还存在另一个问题。主要项目并不是我目前正在进行的唯一主要项目。我有几个项目都引用(通过复制/粘贴)这些其他库。因此,现在我已经更新了库的代码并提交了它,现在我必须返回使用库的每个主项目,并将更改从库git repo复制/粘贴到那些主项目。

工作流程汇总

主项目A->代码文件从库A复制->库A文件在主项目A内部修改->库A文件通过差异比较合并回原始库A文件夹位置->库A代码文件然后复制回使用库A的其他项目A IE:主项目B、主项目C、主项目D。

天哪!随着我的各种项目变得越来越大,这个问题变得越来越复杂。这套系统很管用,但非常非常繁琐。

间歇

所以有点简短的咆哮。/TakesDeepBreath/SIGH我拒绝使用git命令行。它创造了20世纪80年代的MS-DOS Ala。它有20个人,14个人。2014年,美国的开发人员仍在苦苦钻研命令行。在这一天和这个时代,我期待更多。我根本不是在学习一门全新的命令行语言,更不用说不得不在Windows和应用程序之间来回切换了,只是为了做一些从根本上简单的事情,比如提交代码更改。只需快速点击鼠标2-3次,然后输入一条简短的消息,就可以完成一些事情。Git=新的鹰度+不必要的命令行复杂性

话虽如此,我最常使用内置的vs2013 GIT特性进行提交和分支/合并等。但据我所知,它似乎不支持子模块。因此,我使用SourceTree。

结束中场休息。

进入git子模块地狱

正如我所说,除了基本的核心功能之外,我还没有大量使用Git,我只通过测试项目进行了初步测试,但我无法让Git以我需要的方式可靠地工作,而且在使用子模块时经常会有一些混乱,而且经常会因为各种错误而无法提交。

我想做的是

新建一个名为MainProjectA的unity项目并将其作为本地资源库 将Git子模块从库A(本地存储)、库B(本地存储)等添加到主项目A 如果我在MainProjectA内对与LibraryA相关的代码文件进行了更改,我希望能够从MainProjectA内将这些特定的更改提交回LibraryA的repo。 我甚至开始编写一个实用程序,一旦检测到更改,它将在两个不同的文件夹之间自动同步文件。但我放弃了它,因为尽管它可以解决同步问题,但它不会解决GIT提交问题。

另一个问题是,我现有的所有具有本地repo的unity项目都设置为休耕

<Unity Main Project Folder>
  |- .git
  |- Assets
    |-Company Name
      |- MainProjectA
  |- Library
  |- ProjectSettings
  |- .gitignore

<Unity LibraryA Folder>
  |- .git
  |- Assets
    |-Company Name
      |- LibraryA
  |- Library
  |- ProjectSettings
  |- .gitignore

我想做的是在我的主项目中有一个作为我的库的子模块的文件夹一个项目,更具体地说,我只希望<Unity LibraryA Folder>AssetsCompany NameLibraryA的内容作为子模块包含在我的主项目文件夹<Unity Main Project Folder>AssetsCompany NameLibraryA

<Unity Main Project Folder>
  |- .git
  |- Assets
    |-Company Name
      |- MainProjectA
      |- LibraryA (submodule)
  |- Library
  |- ProjectSettings
  |- .gitignore

但是SourceTree/git抱怨我无法将子模块添加到现有的repo文件夹中。<Unity Main Project Folder>AssetsCompany Name

我本打算继续写作,但...是的,我认为这已经足够了,我的目标现在应该被描述得足够好了。

结论

我想我也可以问一下,Git作为一种产品是否已经足够成熟,它甚至可以让我做我想做的事情?或者,考虑到Git的架构,是否根本不可能支持我正在尝试做的事情?

每一次搜索都没有结果,YouTube无济于事,浪费时间,更不用说我能找到的每个示例都是命令行示例,并且没有涉及子模块。

在正常的Windows应用程序中,子模块不会成为问题。具体来说,问题在于Unity喜欢将所有代码文件放在它的项目中。这就是我试图保持我的有序文件夹结构完好无损的方式。

请帮帮忙。请。请给我珀迪的。我求求你了!我求求你了!跪下乞讨!:p

推荐答案

也许您想使用符号链接/硬链接?

<Master Project Folder>   <----- no .git here
|
|-<Unity Main Project Folder>
|   |- .git
|   |- Assets
|     |-Company Name
|       |- MainProjectA
|       |- LibraryA         ------ symlink to --+
|       |- .gitignore   <--------+              |
|   |- Library                   |              |
|   |- ProjectSettings          add LibraryA    |
|   |- .gitignore                               |
|                                               |
|-<Unity LibraryA Folder>                       |
|   |- .git                                     |
|   |- Assets                                   |
|     |-Company Name                            |
|   |- LibraryA       <-------------------------+
|   |- Library
|   |- ProjectSettings
|   |- .gitignore

这应该可以工作,尽管Unity抱怨符号链接。至少在OSX上。

另一种(更正确的)方法是将LibraryA作为子模块,并对其进行单独的测试项目(当前是您的Unity LibraryA Folder)。

我在这个设置中做了2年多(2-3个链接的存储库),Git表现得很好。也许你的图形客户端不是很好?试试gitx-dev或GitHub的桌面客户端(它也适用于非GitHub的repos)--或者只是学习命令行,它是有效的。

哦,向现有目录添加子模块的问题-首先删除目录并提交。

302