unity3d和git子模块有可能吗?

时间:2014-07-22 23:03:43

标签: git unity3d git-submodules

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

所以我在过去2年多的时间里一直在使用git,但我并没有深入研究它。我可以从bitbucket / github等分支/合并push pull,这对常规的win form /传统应用程序来说很好。

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

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

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

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

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

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

去年我一直在做的事情已经过去了

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

    工作流程总结

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

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

    间歇

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

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

    结束中场休息。

    输入git submodule hell

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

    我想做的是这个

    1. 创建名为MainProjectA的新统一项目,并将其设为本地仓库
    2. 从LibraryA(本地仓库),LibraryB(本地仓库)等向MainProjectA添加git子模块
    3. 如果我对MainProjectA内部与LibraryA相关的代码文件进行了更改,我希望能够将这些特定更改从MainProjectA中提交回LibraryA&#39s的repo。
    4. 我甚至开始编写一个实用程序,它会在检测到更改后自动在两个不同文件夹之间同步文件。但我放弃了它,因为虽然它可以解决同步问题,但它无法解决git提交问题。

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

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

      我想要做的是在我的主项目中有一个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
      

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

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

      结论

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

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

      在普通的Windows应用程序子模块中不会出现问题。问题在于团结如何喜欢在其项目中包含所有代码文件。那我以及如何保持我有组织的文件夹结构不变。

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

4 个答案:

答案 0 :(得分:3)

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

<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上。


另一种(和IMO更正确的)方法是将LibraryA作为子模块并为其设置单独的测试项目(目前为Unity LibraryA Folder)。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这就是我所做的。

首先 - 如果您已经将LibraryA的文件复制到项目中,并且您的项目正在使用LibraryA&amp;'s对象&amp;脚本,你必须非常小心。确保在开始时没有从Git存储库中完全修改过......

现在,关闭Unity后,请删除项目所包含的LibraryA文件夹。 Unity,如果它是开放的,那么就会开始窒息死亡。

现在,在项目的Assets文件夹中创建一个硬链接目录(mklink / J文件夹目标),该目录将排列并模仿刚刚删除的文件夹。新的硬链接看起来几乎与您刚删除的内容完全一样。

在Unity中打开您的项目。如果您很幸运,当它完成导入资产时,它仍会在正确的位置拥有正确的对象,但它会更新您的Library文件夹中的内容。没关系。

在Git中确保代表LibraryA的repo中没有更改的文件。只需将其中带有硬链接的目录导入LibraryA,就不应该触及LibraryA的文件。如果是这样,你可能做错了。

检入项目库文件夹中的所有新更改。

现在,您可以继续在Unity中继续开发。

呃,希望如此。

答案 3 :(得分:-2)

我和Unity一直处于同样的境地。老实说,你想要做的就是避免使用Git,并使用SVN和Externs。 Git SubModules实际上不是您从个人经验中寻找的东西,没有办法让它们完全符合您的Unity行为。 Git比SVN有很多优点,但SubModules肯定不是其中之一。

然而,SVN Externs完全按照你想要的方式工作。您可以将LibraryA仓库中的特定文件夹直接签入主仓库。从那里我几乎所有使用的SVN客户端(我在OS X上使用Cornerstone)都允许您直接更新并提交到该extern文件夹,这将修改实际的LibraryA仓库。此外,当您在主回购的基础上进行更新时,所有外部设备也将更新。如果您需要分支项目,可以将externs指向特定的修订而不是头部。