Unity5.5:场景文件的合并问题
前言在多人合作开发时,Unity 的 scene 和 prefab 文件常常发生冲突,偏偏这类文件合并起来又非常麻烦,在 Unity 官网教程中,Smart Merge 这一章专门针对这个问题做了描述。
本篇是对整个智能合并流程的一个笔记,并记录了一些实践过程中碰到的问题。
情景
在我本地是用 TortoiseGit 来管理项目源码的,所以我的目标就是以 TortoiseGit 为核心来实现一个简便的合并流程。
将 Unity 项目纳入 Git 控制
我们先要做一个基本配置,使得这个 Unity 项目满足被 Git 管理的基础要求。
启动 Unity 打开项目,来到 Edit->Project Settings->Editor 菜单下:
将 Mode 设为 Visible Meta Files;将 Asset Serialization 设为 Force Text。
Unity 这边的设置就这么多,比较简单。
然后是一个 .gitignore 的设置,Unity 自动生成的很多文件是不需要纳入版本控制的,不管不顾全部 add 只不过是徒徒占用服务器的硬盘空间,这里可以参考 GitHub 上的 gitignore 项目,简单来说,对于一个完整的 Unity 项目,一般我们只需要将 Assets 和 ProjectSettings 这两个目录纳入版本控制,其他文件及目录都可以直接忽略。
将 UnityYAMLMerge 集成到 TortoiseGit
UnityYAMLMerge 是 Unity 官方提供的一个可以自动合并 scene 和 prefab 文件的工具,位于 Unity 安装目录下,比如我这边就是:
D:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe要将它集成到 TortoiseGit,只需到 TortoiseGit->Settings->Diff Viewer->Merge Tool->Advanced 菜单下,增加
.unity
D:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe merge -p %base %theirs %mine %merged和
.prefab
D:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe merge -p %base %theirs %mine %merged这两项即可。
现在,大部分普通状况下的场景文件合并,比如我们通过 TortoiseGit 做 merge 或者 rebase 操作时,如果发生了冲突,只需右键这个场景文件,然后点击 Edit conficts 按钮,TortoiseGit 会自动调用 UnityYAMLMerge 完成合并(UnityYAMLMerge 窗口不报错即表示合并成功,窗口消失后直接点击 Resolved 按钮标记冲突已解决即可,此时场景文件已经被修改完成)。
合并场景文件时出现 UnityYAMLMerge Error
UnityYAMLMerge.exe 不是万能的,它不能自动解决掉所有类型的场景文件冲突,普通的场景文件修改是很好处理的,基本算是一键合并,但碰到比较特殊的情况时,比如两个人同时对场景里的同一个地方进行了修改,UnityYAMLMerge 就不能确定到底该用哪个人提交的数据了,这时 UnityYAMLMerge 的处理方式是:
先给这个场景文件自动生成三个版本的临时文件(以 .tmp 为扩展名):
Unclean merges will create premerged versions of base, theirs and mine versions of the file.然后调用默认合并工具,让我们人工介入、手动进行比对完成合并。
而这就有了一个问题,默认合并工具到底指的是哪个?UnityYAMLMerge 在智能合并失败时究竟会调起哪个程序呢?这一行为其实是配置在 mergespecfile.txt 文件里的(此文本文件位于 UnityYAMLMerge.exe 同目录下)。
因此,当我们没有正确配置 mergespecfile.txt 文件,UnityYAMLMerge 找不到这个默认合并工具,就会出现报错:
UnityYAMLMerge Error: Couldn't locate merge tool to handle extension tmp in D:\Program Files\Unity\Editor\Data\Tools\mergespecfile.txt这里的报错正是说 UnityYAMLMerge 不知道该启用哪个合并工具来处理这几个 tmp 文件。
因为我现在用的是 TortoiseGit,所以决定直接将 TortoiseGitMerge 设为 UnityYAMLMerge 智能合并失败后的默认启动工具,配置方法是在 mergespecfile.txt 文件里的
#
# Default fallbacks for unknown files. First tool found is used.
#这一句之后加上
# Tortoise Git Merge
* use "D:\Program Files\TortoiseGit\bin\TortoiseGitMerge.exe" -base:"%b" -mine:"%l" -theirs:"%r" -merged:"%d"即可。
现在 UnityYAMLMerge 智能合并失败时,会直接启用 TortoiseGitMerge 来比对远程和本地版本的文件,因为我们前面已经将 Unity 的这些 scene 和 prefab 等序列化文件设置成了文本格式,所以可以正常比对,直接手动处理完成合并。
页:
[1]