目录
一、unity仓库创建流程
1、新建仓库
2、把仓库克隆到本地
3、把工程文件拷贝到克隆地址
4、在unity中进行设置
5、提交到远程仓库
6、分支结构
二、关于提交中的冲突处理
1、线性流程
2、使用冲突处理工具(酌情)
(1)添加环境变量
(2)创建.gitattributes文件
(3)设置冲突处理工具
(4)设置外部merge工具
(5)若不慎保存冲突文件
(6)另:推荐UniMerge插件(该方法好用)
3、充分利用预制体
三、关于大文件上传
1、SSH方式
2、git lfs
四、注
预装:Git、GithubDesktop
远程仓库:Github 或者 码云
注意在.gitignore中选Unity。
选择用desktop打开或者点击复制按钮,复制URL在本地githubdesktop进行clone。
只需要拷贝Assets、Packages、ProjectSettings三个文件夹,其他文件在重新打开工程时会自动生成,可能要花一定时间。
打开工程文件,在unity中对一些选项进行设置,记得要保存场景。
【解释】在使用git进行merge时,如果文件是二进制文件,一旦冲突发生很难查看git插入的冲突标识,无法解决冲突。因此修改设置,使得Unity项目的资产序列化生成文本文件。可以按照上图操作修改Unity的序列化策略,改Mixed为Force Text。这样场景文件和prefab等文件会被序列化为yaml文本文件。
在github desktop中commit工程所做的改变,并点击push提交到github远程仓库。
之后的上传以及拉取都与上面类似,需要注意的是,当其他人修改并上传了内容时,我们在上传的时候会收到提示,这时候点fetch就行。
然后再继续点右上角,先把他人的提交拉取,再提交自己的修改。
可以按照全员改动全放在master分支上的方式,但是不直观,条理性不强,建议的分支结构是master-develop的形式,即平常的开发工作都放在develop上,在develop上建立分支,或者直接提交,将develop分支的稳定版本合并到master上,需要再次开发时,只需要将master分支合并到develop上,继续开发即可。
由于unity中有大量的二进制文件,而git对于这些文件的合并效果并不理想,这个时候如果两个或多个人同时上传内容,就可能会发生冲突,最简单的方式就是从远程和本地中选择一个进行保存,但是和场景关联的timeline等文件会出现对象丢失的现象。
目前有三套方案以供解决:
顾名思义,就是场景轮着来改,甲先打个招呼要改场景,那其他人就不要再做改动了,等甲改完了,其他人再轮着做改动。非常稳,但是效率不够高。可以通过频繁提交来加快速度。
如果改动时没有同时场景时,比如只做了代码修改添加时,或者在不同的场景上修改,这个时候便可以并行工作。
unity自身为我们提供了工具,这个工具可以自动识别比如场景文件,预制体文件之间的不同,并合并其中的差异。
在合并前,我们需要做一些预备工作。首先这个工具我们是用命令行打开的(当然,如果使用SourceTree等工具则不需要),所以我们要预先把git设置好环境变量,再之后,我们需要创建.gitattribute文件,这个文件的作用是设置一个路径下所有文件的属性,把诸如.unity,.prefab标记为文本文件,以便于合并工具进行处理,最后,我们需要把unity内置的合并工具进行一些设置。
步骤如下:
找到git所在的文件夹,将cmd的文件夹加入环境变量。
以文本格式创建,然后直接修改后缀名为.gitattributes。
以文本文档的形式打开,在里面添加:
* text=auto
# keep lf on unity files
*.unity binary
*.prefab binary
*.asset binary
当我们以文本形式存储如场景文件,预制体文件时,git会自动对这些文本进行merge处理,但是格式和语义不全是正确的,因此设置为binary,让unity的mergetool和我们的扩展工具去处理这些文件的合并操作。
unity编辑器里内置了这一工具,文件名称为UnityYAMLMerge.exe,我的文件路径如下:
在.git文件夹里用文本格式打开config(.git为隐藏文件夹,要设置为显示),并添加如下语句:
[merge]
tool = unityyamlmerge[mergetool "unityyamlmerge"]
trustExitCode = false
cmd = 'D:/soft/unity/unity18-4.14/file/Editor/Data/Tools/UnityYAMLMerge.exe' merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"
在config中的视图,路径部分填写该工具的路径:
如果在合并的时候出现了这样的弹窗:
出现这种情况的原因是unity合并工具会尝试为其无法处理的文件查找替代的mergetool,如果找不到所有的默认工具,就会抛出上面的错误。
可以通过上面给出的路径,找到这个mergespecfile文本文件,然后再下载一个merge工具,我下载的是merd,
下载此工具到默认地址,然后将这个工具的地址复制到打开的文本中,对mergespecfile文本进行修改:
修改前:
更换内容:
unity use "%programs%\Meld\Meld.exe" "%r" "%b" "$l" -o "%d" --auto-merge
prefab use "%programs%\Meld\Meld.exe" "%r" "%b" "$l" -o "%d" --auto-merge
#
# Default fallbacks for unknown files. First tool found is used.
#
* use "%programs%\Meld\Meld.exe" "%r" "%b" "$l" -o "%d" --auto-merge
修改后:
之后就是出现冲突时的处理,比如双方同时修改了.unity文件,这时候就会报出冲突,选择open in command line
然后在命令行里输入”git mergetool”,回车,这时候就会自动处理合并修改的部分了。
当遇到unityYAMLmerge无法解决的问题时,控制台会为我们打开meld的工作界面:
在右侧选择我们需要合并修改的文件:
有时候我们会看到除了本体的文件外,还出现了BACKUP、BASE、LOCAL、REMOTE这样的文件,这是git帮我们自动生成的,在合并后会自动删除,这里我们不用管它们,直接选择原文件就行。
等待加载好之后,选择下一冲突,或者前一冲突,就可以跳转到有冲突的区域,我们选择保留哪一项。如果没有冲突项的话,那就不用再修改,直接保存退出就行。
合并修改后,会生成额外的.orig文件,比如我合并的是场景文件,我生成了这些,直接把他们discard掉就可。
之后再打开工程,会提示reload,点击reload,会发现场景已经合并了。
若不慎保存了有冲突的场景文件或者其他文件,这个时候就会因为冲突而无法打开:
我们可以以文本格式打开文件,手动解决冲突。
以文本格式打开冲突文件,在文件中搜索 <<<<<<< HEAD,这个是git为我们生成的冲突标记,找到冲突项,然后我们可以从中选择一项进行保留,当处理完所有的冲突项后,再尝试打开场景,这时候就可以打开了。
但是,虽然我们可以利用这些冲突处理工具来处理,在有时候仍然会出现各种各样的问题,原因是unity将场景强制文本化,转换成的是YAML格式,简单的通过对比来进行替换有时候会造成不正确的结果,我在这个问题上研究了几周还是不尽如人意。
最后找到这么一款插件,效果还不错,可以直接可视化比较场景与场景,以及物体与物体之间的差别,并修改,名称是UniMerge,可以在unityAssetStore里搜到,亲测好用,但是和git的配置做的不太好,也就是说得要手动保存两次的场景,然后放在一块比较修改,然后将修改后的场景保存,虽然这一步有一点点麻烦,但是还是可以尝试。
思路来源于这个视频:https://www.youtube.com/watch?v=YgoCp2tzRh0
具体思路是将场景内需要修改的物体分别转换为预制体,在提交修改时不提交场景,提交其他文件和修改后的预制体,达到弱化和细化冲突的目的。但是由于在资源中的预制体不会保留关于场景中的引用信息,完全不修改场景还是不太可行(或者改善代码的结构,尽量少用public直接赋值),可以留一至两个人可以更改场景,其他合作的成员提交修改的预制体来跟进修改情况。
另外,由于timeline中的Bindings是和场景绑定的,如果二者不同时上传的话,就会丢失绑定,这个问题可以参照我的另一篇博客:unity timeline bindings的存取和读入_owlmo的博客-CSDN博客
此外,如果需要修改的预制体太多,全部应用的话太麻烦,可以参照我的这一篇博客:
unity 一键应用多个预制体_owlmo的博客-CSDN博客_unity生成多个预制体
具体实践时可以这几种方式一起用,但是考虑到其中可能带来的问题,场景文件还是不应该有太多人同时修改。
在使用gitee进行上传时,有时候可能会因为文件过多而出现一些奇怪的问题,原因可能是使用https进行克隆时出现了差错,而SSH方式则更稳定一些。
关于SSH的配置,可以参考这篇文章
github设置添加SSH - 破男孩 - 博客园
配置码云的SSH时,官方有教程。
这个扩展是git中用来传输大的二进制文件的, git传输的单个文件推荐是不超过50MB,上限是100MB(好像,我没查)。如果要传输大文件时,就应该使用git lfs。
首先在官网上下载lfs,然后在需要应用lfs的工程里打开git bash,输入git lfs install,可以看到下面的画面。
然后输入git lfs track进行追踪需要的文件、文件夹、文件类型等即可。
其他的操作和git的普通操作类似,若想了解更多可以参考其他文档。
参考:
GitHub Desktop 使用教程_MaceJin的博客-CSDN博客_githubdesktop使用教程
Unity中的Git最佳实践 - 知乎
Unity,在GithubDesktop中使用UnityYAMLMerge解决合并时场景冲突的问题_lxbhahaha的博客-CSDN博客
Unity场景和代码合并以及UnityYAMLMerge的使用_weixin_30487317的博客-CSDN博客
UnityYAMLMerge Error - Unity Answers
yaml - Unity YAMLMerge error - Stack Overflow
…