【问题标题】:Ignoring folder meta files on version control忽略版本控制上的文件夹元文件
【发布时间】:2013-10-09 16:22:48
【问题描述】:

Unity 为 Asset 文件夹内的文件夹创建和删除元文件。

这可能会在使用版本控制时造成烦人的情况(您可以跳过并转到问题):有人创建了一个文件文件夹,该文件夹将被忽略但忘记忽略该文件夹的元文件。 Unity 创建元文件,此人将元数据添加到版本控制中。另一个人得到了变更集,因为他们没有文件夹,他们的 Unity 删除了元文件,他们从版本控制中删除了元文件。不是团队中的每个人都理解这一点,所以这个过程在地狱般的循环中持续存在。

令人惊讶的是,这种情况一直都在发生。所以,两个问题:

  1. 版本文件夹元文件重要吗?
  2. 有没有办法自动忽略文件夹元文件 - 特别是在 git 或 mercurial 上?

【问题讨论】:

  • 元文件是否与文件在同一个文件夹中? (如docs.unity3d.com/Documentation/Manual/… 中所述)
  • 我发现你的问题非常鼓舞人心,所以我编写了这样一个预提交挂钩脚本。查看git-pre-commit-hook-unity-assets了解更多信息
  • 截至 2016 年,有一个不错的插件可以在您保存场景时清除空文件夹assetstore.unity3d.com/en/#!/content/24284
  • @pal 知道任何更新的替代品吗?我收到与 Unity 2018 不兼容的警告
  • 不怕。在 Mercurial 中,我一直忽略 .+/[^\.]+\.meta 之类的内容,因为它只会匹配名称中没有 . 的内容的 .meta 文件。

标签: git version-control mercurial unity3d


【解决方案1】:

Unity docs 说:

创建新资产时,请确保将资产本身和关联的 .meta 文件都添加到版本控制中。

对我来说,这足以将它们置于版本控制之下。我看到了两种解决问题的方法:

  • 组织:为本地文件夹设置命名约定,例如以“_”开头。但我们都知道这行不通;-)
  • 在所有机器上安装客户端pre-commit hook。我还没有这样做,但它似乎很有希望。

我只是玩弄了不同的 git 命令,以下可能有用: git hook 脚本应首先检查 .gitignore 是否已更改:

git diff-index --cached --name-only HEAD | grep ".gitignore"

如果 .gitignore 中所有新添加的行位于 Assets 文件夹下,则打印出它们的目录名称:

git diff --cached --word-diff=plain .gitignore | grep -o -e "{+\/.*\/Assets\/.*+}" | cut -d + -f 2

更新

我刚刚写了这样一个预提交挂钩 :-) 有关代码,请参阅 GitHub 存储库 git-pre-commit-hook-unity-assets,有关详细信息,请参阅我的 blog posting

【讨论】:

  • 太棒了!谢谢你,凯!
  • 重点是,文件夹本身并不是真正的资产。如果可能,统一不应创建它的元文件
【解决方案2】:

将此添加到 .gitignore

#Ignore all .meta file
*.meta
#But not source file with postfix. which is everything but a folder
!*.*.meta

这将忽略没有后缀的文件。但这不应该受到伤害。

【讨论】:

  • 这真是太棒了! ?
  • +1。但是,虽然这在大多数情况下都很好,但如果您的文件夹包含一个点 (.),就像在 Android 插件中一样,那么无论如何都会包含文件夹元数据。
【解决方案3】:

是的,.meta 文件很重要。它们为您提供了一些有用的任务,例如保留文件和文件夹的 GUID,以便 Unity 可以保留引用,即使文件/文件夹被重命名或重新定位。 See full discussion

你需要添加

# Meta Files built by Visual Studio
*.meta

# Unity3D generated meta files
*.pidb.meta
*.pdb.meta
*.mdb.meta

# Autogenerated files
InitTestScene*.unity.meta
InitTestScene*.unity

# Asset meta data should only be ignored when the corresponding asset is also ignored
!/[Aa]ssets/**/*.meta

进入你的 .gitignore。然后像往常一样,refresh your gitignore

由于最后一行保留(不忽略)Assets 文件夹下的元文件,因此 Assets 文件夹内的文件夹的元文件不会被忽略。

【讨论】:

    【解决方案4】:

    要将元文件与资产一起包含,只需在排除项后添加以下内容:

    !*.*.meta
    

    这是我的 .gitignore 示例:

    # Ignore the following files
    # --------------------------
    # Unity3D specific
    #
    **/Library/*
    **/Temp/*
    **/*.csproj
    **/*.unityproj
    **/*.sln
    **/*.userprefs
    **/*.pidb
    
    # include meta files
    !*.*.meta
    

    我将它放在具有 git 存储库结构的文件夹中,因此我的项目结构类似于:

    root folder /
       - Unity Project/
            - .gitignore
            - .git/
            - ProjectFolder/
                  - {all project related data}
    

    希望有帮助。

    【讨论】:

    • 因为“!”用作例外包含,删除将提供排除。所以要排除一个文件夹,它类似于:*/.*.meta/*(排除元文件夹和后续文件)或只是*/.*。 meta(排除所有带有点元路径的文件夹)
    • 显然,但如果需要,您可以...不知道为什么像您说的那样,这将是您的回购中的一场灾难。
    • 啊,好吧,在查看了我自己的东西之后,我明白了你现在实际指的是什么,我可以看到问题出在哪里......我喜欢 Kay 创建的用于检查预提交的内容.干得好。抱歉,我还不能投票……没有足够的代表:(
    • @Roberto 对不起,我很困惑。 .gitignore 正是为了不提交这些文件。这个解决方案很接近(**/*.meta 应该这样做......对吗?)并且比预提交挂钩要好得多,还是我错过了什么?
    • @chacham15 你不能忽略所有的元文件,它们是 Unity 所必需的——除了文件夹元文件。
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多