unity3d和git子模块有可能吗?

Dea*_*unz 8 git unity-game-engine git-submodules

TLDR; 这将是一个冗长的帖子,但我相信你们中的许多unity3d开发人员也遇到了同样的问题.一个需要明确确定,一劳永逸的答案来拯救我们的集体理智的问题.

所以我在过去2年多的时间里一直在使用git,但我并没有深入研究它.我可以从bitbucket/github等分支/合并推拉,这适用于常规的win表单/传统应用程序.

这是问题所在.我早已从xna/silverlight转移到unity3d和unity,以便添加对库的引用,实际上你必须将源文件从该库复制到unity项目文件夹中.尽管unity允许您将*.dll文件放入Plugin文件夹,但是存在明显的跨平台兼容性问题,因此我从不想去那里.

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

每个单独的库项目都是一个统一项目,每个项目的代码文件都是统一组织的

Assets\<company name>\<project name>\
Assets\<company name>\<library name>\
Assets\<company name>\<another library name>\
Run Code Online (Sandbox Code Playgroud)

我这样做是为了保持高度有序的组织,这与团结资产商店中的许多其他资产不同.:(

所以我的关卡编辑器项目正在使用多个库项目,其代码已通过复制粘贴导入.每个库本身都托管在自己的本地git存储库中.因此,当我将代码文件从库项目粘贴到我的主统一项目时,我会自动失去任何提交我对该库git repo所做的更改的能力.

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

  1. 启动一个主项目 Assets\<company name>\<main project name>\
  2. 导入任何库项目(复制/粘贴代码文件) Assets\<company name>\<library name>\
  3. 如果我需要对其中一个库进行更改,我通常只编辑我正在处理的主项目中的库代码文件.(否则会产生更多复杂性)
  4. 因为主项目也是一个git repo,我对任何库文件所做的更改也会被提交到主项目的repo.
  5. 过了一会儿,我使用CodeCompare(一个diff实用程序)Assets\<company name>\<library name>\与我之前复制库文件的库的原始位置进行文件夹比较.
  6. 我通过diff精心比较每个更改的代码文件差异,并将我的主项目中所做的更改迁移到库的原始位置.
  7. 现在已经完成了,库是一个git repo所以再次(第二次)我必须提交有关对代码文件进行的各种更改.

伴随着这种精神错乱,还有另一个问题.主要项目不是我现在唯一的主要项目.我有一些项目都引用(通过复制/粘贴)这些其他库.所以现在我已经更新了库的代码并提交了它,我现在必须回顾每个使用库的主项目,并将库git repo的更改复制/粘贴到那些主项目.

工作流程总结

MainProjectA->从LibraryA-> LibraryA文件中复制的代码文件在MainProjectA-> LibraryA文件中修改,通过diff比较合并回原始LibraryA文件夹位置 - > LibraryA代码文件,然后复制回使用LibraryA IE的其他项目:MainProjectB,MainProjectC,MainProjectD .

好主!随着我的各种项目变得越来越大,这个问题变得越来越复杂.这个系统有效,但非常繁琐.

幕间休息

所以有点短暂的咆哮./ TakesDeepBreath /叹息我拒绝使用git命令行.它是MS-DOS ala 1980年代的怪诞.这是20个怪人14人.2014年和我们的开发人员仍在使用命令行.在这个时代,我期待更多.我基本上不是在学习一种全新的命令行语言,更不用说在Windows和应用程序之间切换回第四,只是为了做一些基本上简单的事情,比如提交代码更改.只需2-3次快速鼠标点击和短消息即可完成的任务.git = new hawtness +不必要的命令行复杂性

话虽如此,我经常使用内置的vs2013 git功能进行提交和分支/合并等.但据我所知,它似乎不支持子模块.所以我使用SourceTree.

结束中场休息.

输入git submodule地狱

就像我说的那样我还没有使用git超出它的基本核心功能而且我只通过测试项目进行了初步测试但是我不能让git以我需要的方式可靠地工作,并且经常在使用子模块时有点混乱,而且由于各种错误,它往往不会提交.

我想做的就是这个

  1. 创建一个名为MainProjectA的新统一项目,并使其成为本地仓库
  2. 从LibraryA(本地仓库),LibraryB(本地仓库)等向MainProjectA添加git子模块
  3. 如果我对MainProjectA中与LibraryA相关的代码文件进行更改,我希望能够将这些特定更改从MainProjectA中提交回LibraryA的repo.

我甚至已经开始编写一个实用程序,它会在检测到更改后自动在两个不同文件夹之间同步文件.但我放弃了它,因为虽然它可以解决同步问题,但它无法解决git提交问题.

另一个问题是我所有拥有本地回购的现有统一项目都被设置为休耕

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

<Unity LibraryA Folder>
  |- .git
  |- Assets
    |-Company Name
      |- LibraryA
  |- Library
  |- ProjectSettings
  |- .gitignore
Run Code Online (Sandbox Code Playgroud)

我想要做的是在我的主项目中有一个LibraryA文件夹,它是我的LibraryA项目的一个子模块,更具体地说,我只希望将其内容<Unity LibraryA Folder>\Assets\Company Name\LibraryA\作为子模块包含在我的主项目文件夹中<Unity Main Project Folder>\Assets\Company Name\LibraryA\

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

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

我打算继续写作,但是...是的,我觉得写作足够了,现在我的目标应该得到很好的描述.

结论

我想我也可以问天气git已经成熟到足以作为一种产品,甚至可以让我做我想做的事情?或者,根据git的架构来支持我想做的事情,这根本不可能吗?

每次搜索都是空的,YouTube没有帮助,浪费时间,更不用说我能找到的每个例子都是一个命令行示例,而且不涉及子模块.

在普通的Windows应用程序子模块中不会有问题.问题特别在于团结如何在其项目中拥有所有代码文件.这和我如何努力保持我有组织的文件夹结构完好无损.

请帮忙.请.请亲爱的.我求求你!我求求你!我的FRIEAKIN KNEES BEGGING!:P

小智 6

Prime31 网站上有一个非常好的解释和过程:http://prime31.github.io/A-Method-for-Working-with-Shared-Code-with-Unity-and-Git/ 这是我的观点处理这种情况的最佳工作流程。


Krz*_*rko 4

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

<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
Run Code Online (Sandbox Code Playgroud)

尽管 Unity 抱怨符号链接,但这应该可行。至少在 OSX 上是这样。


另一种(在我看来更正确的)方法是作为LibraryA子模块并为其建立一个单独的测试项目(目前您的Unity LibraryA Folder).

我已经在这个设置(2-3 个链接存储库)中完成了 2 年多的时间,并且 git 表现良好。也许你的图形客户端不太好?尝试 gitx-dev 或 github 的桌面客户端(也适用于非 github 存储库) - 或者只是学习命令行,它可以工作。

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