假如你和你的团队,使用版本控制软体(SourceTree、Git Tortoise等)协同工作,那么你一定会遇到这样一种情况:

打开版本控制软体,想要提交一个更改,然后发现莫名其妙多了许多你没修改过的.meta文件,你决定将他们撤销后返回Unity。等待下一次打算提交更改时,它们又会继续出现。

一两次还能接受,长期以往,简直体验极差,多出来的一堆.meta文件,无法删除它们,而且你很可能要花时间在解决这些文件的冲突上。甚至在有些情况下,它还会破坏项目中的资源引用信息,导致你不得不回退版本将信息找回来。

这些.meta文件来源于哪些文件?为什么它们无法被撤销?如何彻底解决这样的问题呢?

1 .meta文件

每当你往Unity的Assets文件夹下添加一个文件或文件夹时,Unity会默认为其生成一个同名带.meta后缀的文件。

这些.meta文件往往存储了这个资源文件的id(id是资源引用的凭据)、压缩格式等信息。

.meta文件是Unity不可或缺的一部分但是它也常常会影响你的项目体验。

参考资料:Behind the Scenes


2. 莫名奇妙的.meta文件

以上描绘的无法撤销.meta文件,大部分是因为:

  • 这些.meta文件对应的是项目中空文件夹的.meta文件
  • 大多数软体使用的版本控制系统,例如git(注:git是一种开源的分散式版本控制系统),会默认不记录空文件夹
  • 如果Unity找不到一个.meta文件对应的资源文件,那么Unity会将这个.meta文件删除

这就造成了这样一种情况:

  1. 你的Unity项目有一个空文件夹,名为"empty", Unity默认为其生成了一个"empty.meta"的文件。
  2. 你打开版本控制软体,由于git不会记录空文件夹"empty",因此你只看到了一个多的"empty.meta"文件出现在修改列表中。
  3. 如果你将"empty.meta"文件撤销,很显然,下一次这个文件仍然会继续出现在修改列表中.
  4. 如果你将"empty.meta"文件提交,同事A拉取了你的提交.由于Unity会删除落单的.meta文件,当A从Unity转到版本控制软体中,会出现"empty.meta"文件被删除的记录.同样,不管撤销,还是提交,这些.meta都会永远保留下来.

是的,这就是为什么你每次想提交资源,总会出现一堆莫名其妙的.meta文件的最主要的原因.


3.怎么彻底删除这些.meta文件

根据上文的叙述,只要每一个协作者都能够删除掉所有项目中空的文件夹,就可以解决这个问题.

这可以很容易地做成一个Unity编辑器工具:.

事实上,AssetStore 有一个免费的非常好用的工具 - Clean Empty Directories - Asset Store

这个工具可以在你保存Unity场景时,自动删除项目中的空文件夹.

值得注意的是,在Mac OS 平台下,这个插件可能会失效.

这是因为工具以"*.*"作为搜索文件的通配符,搜索结果为0时,就会认为这个文件夹为空. 而在Mac OS下,文件夹下可能存在一个操作系统创建的隐藏文件 ".DS_Store".这时候,只需要修改一下搜索的通配符即可.

打开Core.cs 文件,找到 static bool DirHasNoFile(DirectoryInfo dirInfo) 这个函数,将其修改成:

static bool DirHasNoFile(DirectoryInfo dirInfo)
{
FileInfo[] files = null;

try
{
files = dirInfo.GetFiles("*"); //将通配符"*.*"修改为"*",以匹配.DS_Store文件
files = files.Where ( x => ! IsMetaFile(x.Name)).ToArray ();
}
catch (Exception)
{
}

return files == null || files.Length == 0;
}

(注: ".DS_Store"是Mac OS 系统创建用于存储文件夹的显示属性的文件)

将这个工具提交上去,然后让同事们都启用自动删除空文件的功能,并告知他们,提交时将被删除的.meta文件的记录也提交上去.

当每个同事都进行过一次提交操作时,项目中就再也不会出现这样的.meta文件了.

世界,干净,真爽~


推荐阅读:
相关文章