太长了;这将是一篇冗长的文章,但我相信许多 unity3d 开发人员也遇到了和我一样的问题。这个问题需要一个明确、一劳永逸的答案来拯救我们的集体理智。
所以在过去的两年多里我一直在使用 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>\
与统一资产商店中的许多其他资产不同,我这样做是为了使事情保持高度组织性。 :(
因此,我的关卡编辑器项目正在使用多个库项目,其代码已通过复制粘贴导入。每个库本身都托管在自己的本地 git 存储库中。因此,当我将代码文件从库项目复制粘贴到我的主 Unity 项目时,我会自动失去提交对该库 git 存储库所做的更改的任何能力。
去年我一直在做的事情如下
- 启动一个主要项目
Assets\<company name>\<main project name>\
- 导入任何库项目(复制/粘贴代码文件)
Assets\<company name>\<library name>\
- 如果我需要对其中一个库进行更改,我通常只需编辑我正在处理的主项目中的库代码文件。 (否则会出现更复杂的情况)
- 因为主项目也是一个 git 存储库,所以我对任何库文件所做的更改也会提交到主项目的存储库。
- 一段时间后,我使用 CodeCompare(一个 diff 实用程序)来进行文件夹比较
Assets\<company name>\<library name>\
与我之前复制库文件的库的原始位置。
- 我煞费苦心地逐个比较每个更改的代码文件 diff,并将主项目中所做的更改迁移到库的原始位置。
- 现在已经完成了,该库是一个 git 存储库,所以我再次(第二次)必须提交对代码文件所做的各种更改。
除了这种疯狂之外,还有另一个问题。主要项目并不是我现在正在进行的唯一主要项目。我有一些项目都引用(通过复制/粘贴)这些其他库。现在,我已经更新了库的代码并提交了它,现在我必须返回使用该库的每个主项目,并将更改从库 git repo 复制/粘贴到这些主项目。
工作流程总结
MainProjectA->从 LibraryA->LibraryA 复制的代码文件在 MainProjectA->LibraryA 文件中修改,通过差异比较合并回原始 LibraryA 文件夹位置->LibraryA 代码文件,然后复制回使用 LibraryA 的其他项目 IE:MainProjectB、MainProjectC、MainProjectD 。
好主啊!随着我的各种项目变得越来越大,这个问题变得越来越复杂。这个系统可以工作,但是非常非常乏味。
中场休息
所以有点简短的咆哮。 /TakesDeepBreath /sigh 我拒绝使用 git 命令行。它是 1980 年代 MS-DOS 的产物。一共20个人,14个人。 2014 年,美国的开发者仍然在用命令行苦苦钻研。在这个时代,我期望更多。我基本上不是在学习一种全新的命令行语言,更不用说必须在窗口和应用程序之间来回切换,只是为了做一些基本简单的事情,比如提交代码更改。只需快速点击 2-3 次鼠标并输入简短的消息即可完成。 git = 新的 hawtness + 不必要的命令行复杂性
话虽如此,我最常使用内置的 vs2013 git 功能来进行提交和分支/合并等。但据我所知,它似乎不支持子模块。为此我使用 SourceTree。
中场休息结束。
进入 git 子模块地狱
就像我说的,除了基本的核心功能之外,我还没有使用过 git,而且我只通过测试项目进行了初步测试,但我无法让 git 按照我需要的方式可靠地工作,而且在使用子模块时经常会出现这样的情况:有点混乱,而且很多时候会因为各种错误而不会提交。
我想做的是这个
- 创建名为 MainProjectA 的新统一项目并将其设为本地存储库
- 将 git 子模块从库(本地存储库)、库(本地存储库)等添加到 MainProjectA
- 如果我对 MainProjectA 内与 LibraryA 相关的代码文件进行更改,我希望能够将这些特定更改从 MainProjectA 内提交回 LibraryA 的存储库。
我什至开始编写一个实用程序,一旦检测到更改,它就会自动同步两个不同文件夹之间的文件。但我放弃了它,因为虽然它可以解决同步问题,但不能解决 git 提交问题。
另一个问题是我现有的所有具有本地存储库的统一项目都设置为休闲项目
<Unity Main Project Folder>
|- .git
|- Assets
|-Company Name
|- MainProjectA
|- Library
|- ProjectSettings
|- .gitignore
<Unity LibraryA Folder>
|- .git
|- Assets
|-Company Name
|- LibraryA
|- Library
|- ProjectSettings
|- .gitignore
我想要做的是在我的主项目中有一个 Library 文件夹,它是我的 Library 项目的子模块,更具体地说,我只想要以下内容<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 抱怨我无法将子模块添加到现有的存储库文件夹中。<Unity Main Project Folder>\Assets\Company Name\
我本来打算继续写,但是……是的,我认为写得足够多了,现在我的目标应该已经描述得足够好了。
结论
我想我还可以问 git 作为一个产品是否已经足够成熟,它甚至可以让我做我想做的事情?或者考虑到 git 的架构根本不可能支持我想做的事情?
每次搜索都是空的,YouTube 没有任何帮助,而且浪费时间,更不用说我能找到的每个示例都是命令行示例,并且不涉及子模块。
在普通的 Windows 应用程序中,子模块不会成为问题。问题具体在于 Unity 如何将所有代码文件都包含在其项目中。那以及我如何努力保持我组织的文件夹结构完整。
请帮忙。请。普迪请。我求求你!我求求你!我跪在地上乞求! :P