介绍

多人使用 Git 协作时经常会有冲突,Git 默认会添加冲突标记到冲突的文本文件中,如果未进行正确处理而直接提交,则文件处于错误状态。

Unity 中使用 meta 文件存储额外的信息,如 GUID、创建时间、导入选项等等,而这个 meta 文件是以文本存储的。

如果有时候忘记提交资源对应的 meta 文件,导致其他人在新建分支后将 meta 文件提交到仓库中,在最后进行合并时与主干上提交的 meta 文件会发生冲突。

如果合并时粗心大意将文件直接添加后提交,则文件会保留冲突标记,而 Unity 无法解析这种格式不正确的 YAML 文件,会报错。

环境

  • Git
  • Unity

问题

Unity 会在 Console 中上报 Unable to parse YAML file: [could not find expected ':'] at line 2,大部分情况下是因为合并错误导致文件中存在冲突标记导致的。

解决

可以使用工具快速对项目进行检查,因为要检查的是文本形式的冲突标记,因此全局查找即可。

工具

FindMergeConflicts.py /path/to/unity/project

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python

import os
import sys
import string

assets = os.path.dirname(os.path.realpath(__file__))
result = []

# Find GUID
def checkguid(path):
    currFile = open(path)
    lines = currFile.readlines()
    currFile.close()
    for line in lines:
        if line.startswith("<<<<<<< ") or line == "=======\n" or line.startswith(">>>>>>> "):
            result.append(path[len(assets) + 1:])
            break

if len(sys.argv) == 2:
    assets = sys.argv[1]

for root, dirs, files in os.walk(assets):
    for file in files:
        checkguid(root + '/' + file)

# Output Result
if len(result) != 0:
    print str(len(result)) + ' Founded!'
    for line in result:
        print line
else:
    print 'Not Found!'