使用 Git 和 Meld for Unity 2019.3+ 设置 Unity Smart Merge

Setting up Unity Smart Merge with Git and Meld for Unity 2019.3+

我到处寻找有关此事的文档,但收效甚微。当谈到这种动态时,Unity 自己的文档非常不完整。我在这里为您提供我能够让它工作的唯一方法。当然,如果能提供有关如何做得更好的反馈,我将不胜感激,但就目前而言,几乎所有关于此主题的 Google 搜索都已有 2 年或更早的历史。

Unity 文档说要将以下内容添加到 .git/config:

[merge]
    tool = unityyamlmerge

[mergetool "unityyamlmerge"]
    trustExitCode = false
    cmd = '<path to UnityYAMLMerge>' merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"

社区的绝大多数人都同意这一点,并告诉您将其中之一添加到 .gitattributes:

*.unity binary
*.prefab binary
*.asset binary

* text=auto

# Unity files
*.meta -text merge=unityyamlmerge diff
*.unity -text merge=unityyamlmerge diff
*.asset -text merge=unityyamlmerge diff
*.prefab -text merge=unityyamlmerge diff

这两个都不起作用。我发现了上面代码块的许多不同替代方案。我找了几天,甚至浪费了整个周末。什么都行不通,我找不到任何关于此事的最新信息。

在 Windows 10 上使用 Unity 2019.3+ 和 Git 的当前版本,这是我让它工作的唯一方法。

mergespecfile.txt

首先,将以下条目添加到 mergespecfile.txt 以允许 Unity 的智能合并使用您选择的 diff 工具。我在这里使用 Meld。请注意 --auto-merge 是可选的。我的理解是它会跳过提示你进行合并。

文件位置 - Windows: C:\Program Files\Unity\Hub\Editor\<unity version>\Editor\Data\Tools

文件位置 - Mac: /Applications/Unity/Hub/Editor/<unity version>/Unity.app/Contents/Tools

unity use "%programs%\Meld\meld.exe" "%l" "%r" "%b" "%d"
prefab use "%programs%\Meld\meld.exe" "%l" "%r" "%b" "%d"
* use "%programs%\Meld\meld.exe" "%l" "%r" "%b" "%d"

.gitattributes

接下来将其添加到您的存储库的 .gitattributes 中。您在此处指定的任何文件类型都将通过 Unity 的智能合并 运行。此处列出的任何 NOT 都将默认为 Git 的自动合并,您可以在其中 运行 git mergetool 调用我们选择的 diff 工具进行合并.

# Macro for Unity YAML-based asset files.
[attr]unityyaml -text merge=unityyamlmerge diff

# Unity files
*.meta unityyaml
*.unity unityyaml
*.asset unityyaml
*.prefab unityyaml

.git/config

最后,这是最难弄清楚的部分,将以下内容添加到您的 .git/config。该文件对语法的使用方式非常挑剔。与大多数文档相反,似乎使用合并驱动程序是触发它的唯一方法。

确保更改文件路径以匹配您的 version/operating 系统,并将 merge/diff 工具更改为您喜欢的任何一个。

[merge "unityyamlmerge"]
    driver = 'C:/Program Files/Unity/Hub/Editor/2019.3.14f1/Editor/Data/Tools/UnityYAMLMerge.exe' merge -p \"$BASE\" \"$REMOTE\" \"$LOCAL\" \"$MERGED\"
    name = Unity SmartMerge (UnityYamlMerge)
    recursive = binary
[diff]
    tool = meld
[difftool "meld"]
    path = C:/Program Files (x86)/Meld/meld.exe
[merge]
    tool = meld
[mergetool "meld"]
    path = C:/Program Files (x86)/Meld/meld.exe
    prompt = false

更新 - 2021 年 9 月 23 日

自 Unity 2021.1.21f1 起,这些设置将继续按预期工作。