假如你和你的團隊,使用版本控制軟體(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文件了.

世界,乾淨,真爽~


推薦閱讀:
相关文章