问题

Unity 官方 meta 文件介绍

Unity 会将 Assets 目录下的所有文件创建文件名 + .meta 的文件,存储文件相关的配置。

在项目中经常会出现只提交了资源文件或 .meta 文件、漏了另一个文件的情况,这会导致其他人更新仓库并打开 Unity 后,本地出现 Unity 自动生成的 .meta 文件或提示缺失资源文件的报错。

这种问题必须在源头进行处理,即提交时进行检查。

需求

  1. 提交时同时检查缺失的 .meta 文件与资源文件。
  2. 提示信息友好,支持定制输出信息的格式。
  3. 尽可能少的依赖,这可以大大减少部署时的麻烦,特别是在客户端。
  4. 易于集成到现有流程中。

SVN

SVN 是集中式版本控制软件,因此提交检查需要在服务器上执行。

环境

  • CentOS 6.8
  • Python 2.6

候选

C# 编写的可执行程序,使用的是硬编码的 Windows SVN 路径,无法在 Linux 上面使用。

使用 shell 的 diff grep sort 等命令组合进行检查,但是输出结果无法定制,只能使用 diff 的格式。

Python 编写的检查代码,有合理的脚本划分,可以自定义格式输出。可以运行在 Linux 上,服务器环境可以自定义,使用 Python 较为简单。

使用

正常代码在 Python 2.7 及以上可以直接使用,但是在 Python 2.6 版本下需要额外修复一下,把 subprocess.check_output 改为 proc.communicate

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
diff --git a/svnlook.py b/svnlook.py
index 4365432..b46d98d 100644
--- a/svnlook.py
+++ b/svnlook.py
@@ -1,6 +1,7 @@
 import os
 import subprocess
 import fnmatch
+from subprocess import PIPE,Popen

 svnlook = "/usr/bin/svnlook"
 BypassCommand = "bypass-hook"
@@ -20,7 +21,9 @@ class SvnLook:
                        command = [svnlook, params, "-t", self.txn, self.repo]
                else:
                        command = [svnlook, params, "-r", self.revision, self.repo]
-               return subprocess.check_output(command, universal_newlines = True)
+               proc = Popen(command, stdout=PIPE)
+               return proc.communicate()[0]

        def GetChanges(self, changeType):
                changes = self.Call("changed")

另外有运行时警告,也可以一起去除:

 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
diff --git a/pre-commit.py b/pre-commit.py
index ae3793a..b193969 100644
--- a/pre-commit.py
+++ b/pre-commit.py
@@ -1,17 +1,16 @@
 #!/usr/bin/python

 import sys
-from sets import Set
 from svnlook import SvnLook
 import assets

-InvalidFiles = Set(["Thumbs.db"])
+InvalidFiles = set(["Thumbs.db"])

 def EnforceMetadata(changes):
        ret = True

-       files = Set()
-       metas = Set()
+       files = set()
+       metas = set()
        for change in changes:
                change = assets.RemoveTrailingSlash(change)
                if assets.IsAsset(change):

可以在服务器的钩子文件 pre-commit 中增加对此脚本的调用:

1
2
3
4
5
6
# check missing meta files in Assets directory
cd /path/to/unity_svn_checker
python pre-commit.py "$@"
if [[ $? != 0 ]];then
    exit 1
fi

Git

Git 是分布式版本控制软件,提交都是在本地提交,然后推送到服务器上。

如果想要提高效率,那么需要在本地提交时进行检查;另外为了保险起见,也需要在服务器的推送钩子中进行二次检查。

环境

  • Windows 10
  • Git 2.29.2

候选

使用 Bash 脚本编写,在 Windows 平台上只依赖于 Git for Windows。

使用

只需要将钩子脚本拷贝到 .git/hooks/ 目录下就可以执行检测,具体参考文档内容。

在项目中使用时可能要配置初始化脚本将钩子脚本符号链接到仓库内的脚本,便于后续更新脚本内容。